我尝试使用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来强制完全匹配。
有什么建议吗?
答案 0 :(得分:4)
除了@ Richard的解决方案之外,还有多种方法可以实施完全匹配。
&#34; \ B&#34;是用于识别模式之前/之后的单词的锚点
> grepl("\\bWord1\\b",c("Word1","Word2","Word12"))
[1] TRUE FALSE FALSE
&#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,'$')