在 R Studio 中使用数据帧。PODMap
,其中一列有这样的句子:"在我的财产中,有一所房子在38.1234,123.1234,我也有一辆车"。我想创建新列,一个用于纬度,一个用于经度。
Fvalue
是数据框。到目前为止,我有
matches <- regmatches(fvalue[,"PODMap"], regexpr("..\.....", fvalue[,"PODMap"], perl = TRUE))
由于文本中唯一的句点是经度和纬度,因此这将返回每个字符串中列出的第一个纬度或经度(仍在努力寻找正则表达式来从纬度之后获取经度,但这是一个不同的问题(。问题是,例如,如果我的向量是c("test 38.1111", "x", "test 38.2222")
那么它会返回具有正确值的 (38.1111. 38.2222(,但向量不会是我的数据框的正确长度并且不匹配。我需要它为每个没有与正则表达式匹配的值的字符串返回一个空白或 0 或 NA,以便它可以作为列放入数据框中。如果我完全错了,也请告诉我。
您可以使用返回相同长度的列表的regexec
,这样您就不会丢失不匹配的空格
PODMap<-c("At my property there is a house at 38.1234, 123.1234 and also I have a",
"Test TEst TEST Tes T 12.1234, 123.4567 test Tes",
"NO LONG HEre Here No Lat either",
"At my property there is a house at 12.1234, 423.1234 and also I have ")
Index<-c(1:4)
fvalue<-data.frame(Index,PODMap)
matches <- regmatches(fvalue[,"PODMap"], regexec("..\.....", fvalue[,"PODMap"], perl
= TRUE))
> matches
[[1]]
[1] "38.1234"
[[2]]
[1] "12.1234"
[[3]]
character(0)
[[4]]
[1] "12.1234"
使用包stringr
,我们可以得到长和纬度。
library(stringr)
matches<-str_match_all(fvalue[,"PODMap"], ".\d\d\.\d\d\d\d")
> matches
[[1]]
[,1]
[1,] " 38.1234"
[2,] "123.1234"
[[2]]
[,1]
[1,] " 12.1234"
[2,] "123.4567"
[[3]]
[,1]
[[4]]
[,1]
[1,] " 12.1234"
[2,] "423.1234"
\d
检查任何数字 1:9,因此将排除任何单词,我们使用str_match_all
从字符串中获取所有匹配项,因为regmatches
只获取第一个匹配项。 不过,str_match_all
会将值设置为 NULL 而不是 character(0(,这应该不是问题。
查看此正则表达式演示