【发布时间】:2014-04-23 10:34:21
【问题描述】:
这里,
a<-c("Look at the sky", "Sun is bright", "cloudy day")
b<-c("sky", "day")
我想根据b 对a 进行子集化。我的首选答案是:
"Look at the sky", "cloudy day"
如何在 R 中做到这一点?
【问题讨论】:
这里,
a<-c("Look at the sky", "Sun is bright", "cloudy day")
b<-c("sky", "day")
我想根据b 对a 进行子集化。我的首选答案是:
"Look at the sky", "cloudy day"
如何在 R 中做到这一点?
【问题讨论】:
您可以使用 sapply 将 a 与 b 中的所有术语匹配
sapply(b, grepl, a)
sky day
[1,] TRUE FALSE
[2,] FALSE FALSE
[3,] FALSE TRUE
然后您折叠所有包含apply 和子集a 的行。
a[apply(sapply(b, grepl, a), 1, any)]
[1] "Look at the sky" "cloudy day"
创建一个组合的正则表达式模式
paste(b, collapse="|")
[1] "sky|day"
然后用它grep
a[grepl(paste(b, collapse="|"), a)]
[1] "Look at the sky" "cloudy day"
【讨论】:
pattern <- paste(b, collapse="|") 足以满足选项 2。无需将模式括在括号中。 grep 的另一种替代方法是:grep(pattern, a, value=T)。
尝试stringi 包中的字符串搜索工具:
library(stringi)
a[sapply(a, function(ae) any(stri_detect_fixed(ae, b)))]
## [1] "Look at the sky" "cloudy day"
这里我们检测a中的每个字符串是否包含b中的任何字符串作为其子序列。
【讨论】: