与grepl R完全匹配

时间:2017-09-11 10:46:07

标签: r grepl

我尝试使用grepl从数据框中提取某些记录。

这是基于两列Result和Names之间的比较。这个变量是这样构建的" WordNumber"但是对于同一个单词,我有多个数字(超过30个),所以当我使用grepl表达式得到例如Word1时,我也得到了我想避免的结果,比如Word12。

有关如何解决此问题的任何想法?

Names <- c("Word1")
colnames(Names) <- name
Results <- c("Word1", "Word11", "Word12", "Word15")
Records <- c("ThisIsTheResultIWant", "notThis", "notThis", "notThis") 
Relationships <- data.frame(Results, Records)

Relationships <- subset(Relationships, grepl(paste(Names$name, collapse = "|"), Relationships$Results))

如果我使用fixed = TRUE而不是根本不返回任何结果(这很奇怪),这不起作用。我也尝试将名称部分与其他类似的数字联系起来,但没有成功:

Relationships <- subset(Relationships, grepl(paste(paste(Names$name, '3', sep = ""), collapse = "|"), Relationships$Results))

由于我连接起来我不确定如何使用\ b来强制完全匹配。

有什么建议吗?

3 个答案:

答案 0 :(得分:4)

除了@ Richard的解决方案之外,还有多种方法可以实施完全匹配。

\ B'/ H3>
  

&#34; \ B&#34;是用于识别模式之前/之后的单词的锚点

> grepl("\\bWord1\\b",c("Word1","Word2","Word12"))
[1]  TRUE FALSE FALSE

\&LT; &安培; \&GT;

  

&#34; \&LT;&#34;是一个单词开头的转义序列,&#34;&gt;&#34;用于结束

> grepl("\\<Word1\\>",c("Word1","Word2","Word12"))
[1]  TRUE FALSE FALSE

答案 1 :(得分:3)

我认为这只是:

Relationships[Relationships$Results==Names,]

如果你最终做^Word1$,你只需做一个直接的子集。 如果您有多个名称,请改为使用:

Relationships[Relationships$Results %in% Names,]

答案 2 :(得分:1)

使用^来匹配字符串的开头,使用$来匹配字符串的结尾

Names <-c('^Word1$')

或者,要应用于整个名称向量

Names <-paste0('^',Names,'$')