部分字符串匹配与新列中的匹配正则表达式 - R
Partial String Match with matching regular expression in new column - R
我正在尝试将数据集中一列的内容与一串正则表达式部分匹配。然后我希望匹配行在新列中返回特定匹配的正则表达式。我的实际数据集很大(130 万行),包含 300 个正则表达式,因此找到一种自动执行此操作的方法很重要,这样添加新的正则表达式就不需要代码调整。
演示:
try.dat<-data.frame(c(1:10),c("hello","goodbye","tidings","partly","totally"))
names(try.dat)[1]<-"num"
names(try.dat)[2]<-"words"
try.dat
在这种情况下,如果一个正则表达式是 'ly',我希望在匹配行(部分、全部)中有一个带有 'ly' 的列,以及一些 'non-matched' 项其他行。我已经成功地使用 grepl (subset not based on exact match) 对数据进行了子集化,效果很好,但这是下一步我真的很挣扎!
我在尝试这个方面取得了 一些 的进展,主要是基于我已经改编的代码建议 (partial string matching R):
pattern<-c("ll|ood")
matching<-c("ood","ll")
regexes<-data.frame(pattern,matching)
output_vector<-character(nrow(try.dat))
for(i in seq_along(regexes)){
output_vector[grepl(x=try.dat$words,pattern=regexes[[i]][1])] <- regexes [[i]][2]
}
try.dat$match<- output_vector
try.dat
如您所见,returns 匹配行旁边有一个“1” - 到达那里,但我 运行 没主意了!我想知道是否有人可以提供任何指示?
谢谢!
我觉得这样可以吗?
library(stringr)
try.dat$match = str_extract(try.dat$words, "ll|ood")
try.dat
# num words match
# 1 1 hello ll
# 2 2 goodbye ood
# 3 3 tidings <NA>
# 4 4 partly <NA>
# 5 5 totally ll
# 6 6 hello ll
# 7 7 goodbye ood
# 8 8 tidings <NA>
# 9 9 partly <NA>
# 10 10 totally ll
默认行为是提取第一个匹配项。如果您想获得所有匹配项,您可以使用 str_extract_all
,但在这种情况下,您需要一个非 data.frame 设置来处理不同数量的匹配项。
基本 R 选项。只是因为.
patt <- c("ll", "ood")
for (i in 1: length(patt)) {
try.dat[grep(patt[i], try.dat$words), "match"] <- patt[i]
}
try.dat
# num words match
#1 1 hello ll
#2 2 goodbye ood
#3 3 tidings <NA>
#4 4 partly <NA>
#5 5 totally ll
#6 6 hello ll
#7 7 goodbye ood
#8 8 tidings <NA>
#9 9 partly <NA>
#10 10 totally ll
运行 两者基于扩展到 1000 万行的数据集的时间比较(Macbook Pro OS X):
try.dat<-data.frame(c(1:10000000),c("hello","goodbye","tidings","partly","totally"))
system.time(try.dat[str_extract(try.dat$words,"ll|ood"),"match"])
用户系统已过期
5.167 0.208 5.348
system.time(for (i in 1: length(patt)) {try.dat[grep(patt[i], try.dat$words), "match"] <- patt[i]})
用户系统已过期
0.311 0.041 0.377
目前的迹象表明,基础 R 版本显着提高了效率。将在我的实际数据集上尝试这个(400< reg ex 超过 200 万行,看看它是否继续击败包版本。干杯!
我正在尝试将数据集中一列的内容与一串正则表达式部分匹配。然后我希望匹配行在新列中返回特定匹配的正则表达式。我的实际数据集很大(130 万行),包含 300 个正则表达式,因此找到一种自动执行此操作的方法很重要,这样添加新的正则表达式就不需要代码调整。
演示:
try.dat<-data.frame(c(1:10),c("hello","goodbye","tidings","partly","totally"))
names(try.dat)[1]<-"num"
names(try.dat)[2]<-"words"
try.dat
在这种情况下,如果一个正则表达式是 'ly',我希望在匹配行(部分、全部)中有一个带有 'ly' 的列,以及一些 'non-matched' 项其他行。我已经成功地使用 grepl (subset not based on exact match) 对数据进行了子集化,效果很好,但这是下一步我真的很挣扎!
我在尝试这个方面取得了 一些 的进展,主要是基于我已经改编的代码建议 (partial string matching R):
pattern<-c("ll|ood")
matching<-c("ood","ll")
regexes<-data.frame(pattern,matching)
output_vector<-character(nrow(try.dat))
for(i in seq_along(regexes)){
output_vector[grepl(x=try.dat$words,pattern=regexes[[i]][1])] <- regexes [[i]][2]
}
try.dat$match<- output_vector
try.dat
如您所见,returns 匹配行旁边有一个“1” - 到达那里,但我 运行 没主意了!我想知道是否有人可以提供任何指示?
谢谢!
我觉得这样可以吗?
library(stringr)
try.dat$match = str_extract(try.dat$words, "ll|ood")
try.dat
# num words match
# 1 1 hello ll
# 2 2 goodbye ood
# 3 3 tidings <NA>
# 4 4 partly <NA>
# 5 5 totally ll
# 6 6 hello ll
# 7 7 goodbye ood
# 8 8 tidings <NA>
# 9 9 partly <NA>
# 10 10 totally ll
默认行为是提取第一个匹配项。如果您想获得所有匹配项,您可以使用 str_extract_all
,但在这种情况下,您需要一个非 data.frame 设置来处理不同数量的匹配项。
基本 R 选项。只是因为.
patt <- c("ll", "ood")
for (i in 1: length(patt)) {
try.dat[grep(patt[i], try.dat$words), "match"] <- patt[i]
}
try.dat
# num words match
#1 1 hello ll
#2 2 goodbye ood
#3 3 tidings <NA>
#4 4 partly <NA>
#5 5 totally ll
#6 6 hello ll
#7 7 goodbye ood
#8 8 tidings <NA>
#9 9 partly <NA>
#10 10 totally ll
运行 两者基于扩展到 1000 万行的数据集的时间比较(Macbook Pro OS X):
try.dat<-data.frame(c(1:10000000),c("hello","goodbye","tidings","partly","totally"))
system.time(try.dat[str_extract(try.dat$words,"ll|ood"),"match"])
用户系统已过期
5.167 0.208 5.348
system.time(for (i in 1: length(patt)) {try.dat[grep(patt[i], try.dat$words), "match"] <- patt[i]})
用户系统已过期
0.311 0.041 0.377
目前的迹象表明,基础 R 版本显着提高了效率。将在我的实际数据集上尝试这个(400< reg ex 超过 200 万行,看看它是否继续击败包版本。干杯!