我正在尝试从原始数据集中提取纬度和经度。我感兴趣的信息始终遵循相同的模式,即:
当我执行以下操作时,我能够准确删除我想要保留的信息。有没有办法做相反的事情并实际保留我目前正在使用 gsub 删除的信息?
data$l1<-gsub('(,)([0-9]+)([.])([0-9]+)[ ]([0-9]+)([.])([0-9]+)(,)',
'\\2\\3\\4\\5\\6\\7',
data$V1)
数据集如下所示:
V1
60346241,[37.55 55.22 5km],katekin,55.745011917 37.604520766,2013-12-04 11:59:07
603423423,[37.55 55.22 5km],#hello,#yes,miguel,53.23452 38.7379422,2013-12-04 11:49:09
因此,在此示例中,我想生成一个新变量 V2,即
V2
55.745011917 37.604520766
53.23452 38.7379422
最佳答案
我会使用 gregexpr
和 regmatches
regmatches(d$V1, gregexpr("(?<=,)\\d{1,3}\\.\\d+\\s\\d{1,3}\\.\\d+", d$V1, perl = TRUE))
#[[1]]
#[1] "55.745011917 37.604520766"
#
#[[2]]
#[1] "53.23452 38.7379422"
将其取消列出并将其放入新变量中由提问者决定。
这里的方法是查找 1 到 3 位数字,后跟一个小数 (
\\d{1,3}\\.
),然后是一些数字和一个空格 ( \\d+\\s
),然后重复,除非没有尾随空格。整个事情前面应该有一个逗号。因此,您可以对逗号使用后视(即 (?<=,)
)您可以使用
gsub
,但需要稍作修改:gsub("^.+?(?<=,)(\\d{1,3}\\.\\d+\\s\\d{1,3}\\.\\d+).+$", "\\1", d$V1, perl = TRUE)
# [1] "55.745011917 37.604520766" "53.23452 38.7379422"
使用
gsub
方法,我使用捕获组来捕获我想要的部分: (\\d{1,3}\\.\\d+\\s\\d{1,3}\\.\\d+)
,但我也匹配从行开始到我想要捕获的所有内容: ^.+?(?<=,)
以及它之后的所有内容,直到行尾: .+$
数据:
d <- read.table(text = "V1
60346241,[37.55 55.22 5km],katekin,55.745011917 37.604520766,2013-12-04 11:59:07
603423423,[37.55 55.22 5km],#hello,#yes,miguel,53.23452 38.7379422,2013-12-04 11:49:09", header = TRUE, comment.char = "", sep = "\t")
关于regex - 从原始字符串中提取模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38023800/