【发布时间】:2016-01-04 00:04:21
【问题描述】:
我正在尝试将数据集中列的内容与一串正则表达式进行部分匹配。然后,我想匹配在新列中返回特定匹配正则表达式的行。我的实际数据集很大(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”的列,而在其他行中有一些“不匹配”的术语。我已经成功地使用 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
如您所见,这会在匹配的行旁边返回一个“1” - 到达那里,但我已经没有想法了!我想知道是否有人可以提供任何指示?
谢谢!
【问题讨论】:
-
不确定你想要什么作为输出。带有正则表达式匹配索引的新
match列?您可以发布所需的输出列吗? -
是的,你是对的@PierreLafortune,所以对于“部分”这个词和正则表达式“ly”,我想在匹配列中使用“ly”。为了扩大范围,我的实际数据集基于拼写/商品名称等不同的药物处方的项目代码 - 我的正则表达式将提供指向标准化短语的链接,然后允许我将项目代码与实际产品相匹配分发 - 很难解释何时数据集太大而无法发布!
-
如果你想知道哪个模式匹配,你需要做两个
greps。您还应该有一个应急计划,以防两者匹配。如果你统一你的例子,你的问题会更清楚。您最初谈论匹配"ly",但当您共享代码时,它是"ll|ood"。 -
道歉@Gregor,以便澄清:word = hello,reg ex = ll,match = ll
-
您介意给出一个双 grep 的简单示例吗?我对 stringr 有一点尝试,但我到了它似乎不起作用的地步,所以寻求其他途径