与 grepl R 完全匹配

Exact match with grepl R

我正在尝试使用 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 而它 return 根本没有任何结果(这很奇怪)。我也试过像这样将名称部分与其他数字连接起来,但没有成功:

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

因为我在串联,所以我不太确定如何使用 \b 强制执行完全匹配。

有什么建议吗?

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

Names <-c('^Word1$')

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

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

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

\b

"\b" is an anchor to identify word before/after pattern

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

\< & \>

"\<" is an escape sequence for the beginning of a word, and ">" is used for end

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

我认为这只是:

Relationships[Relationships$Results==Names,]

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

Relationships[Relationships$Results %in% Names,]