使用R中旧向量中的字符串从文本创建新向量

时间:2018-09-24 21:20:42

标签: r regex

在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,以便可以将其作为列放入数据框中。如果我要彻底解决这个问题,也请让我知道。

1 个答案:

答案 0 :(得分:1)

您可以使用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,我们可以同时获取long和lat。

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),这应该没有问题。

Check out this regex demo