我正在尝试使用 grepl 从数据框中提取某些记录。
这是基于两列结果和名称之间的比较。这个变量是这样构建的,但是对于同一个单词,我有多个数字(超过 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))
Run Code Online (Sandbox Code Playgroud)
这不起作用,如果我使用fixed = TRUE它根本不返回任何结果(这很奇怪)。我也尝试将名称部分与这样的其他数字连接,但没有成功:
Relationships <- subset(Relationships, grepl(paste(paste(Names$name, '3', sep = ""), collapse = "|"), Relationships$Results))
Run Code Online (Sandbox Code Playgroud)
由于我正在连接,因此我不太确定如何使用 \b 来强制执行完全匹配。
有什么建议?
par*_*rth 10
除了@Richard 的解决方案之外,还有多种方法可以强制执行完全匹配。
“\b”是在模式之前/之后识别单词的锚点
> grepl("\\bWord1\\b",c("Word1","Word2","Word12"))
[1] TRUE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
"\<" 是单词开头的转义序列,">" 用于结尾
> grepl("\\<Word1\\>",c("Word1","Word2","Word12"))
[1] TRUE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
小智 5
使用 ^ 匹配字符串的开头,使用 $ 匹配字符串的结尾
Names <-c('^Word1$')
Run Code Online (Sandbox Code Playgroud)
或者,应用于整个名称向量
Names <-paste0('^',Names,'$')
Run Code Online (Sandbox Code Playgroud)
我认为这只是:
Relationships[Relationships$Results==Names,]
Run Code Online (Sandbox Code Playgroud)
如果你最终这样做了,^Word1$你只是在做一个直接的子集。如果您有多个名称,请改为使用:
Relationships[Relationships$Results %in% Names,]
Run Code Online (Sandbox Code Playgroud)