我有两个列表,如下所示。我正在寻找一个输出,其中dat1的每一行将匹配dat中的完整列,并在此基础上,我将得到结果
dat <- data.frame(v=c('apple', 'le123', 'app', 'being', 'aple',"beiling"))
dat1 <- data.frame(v1=c('app','123', 'be'))
我尝试过两种选择,但没有成功
test <- mapply(grepl, pattern=dat1$v1, x=dat$v)
str_detect(as.character(dat$v),dat1)
我得到的输出是
TRUE TRUE FALSE FALSE FALSE TRUE
但我想要的输出是
TRUE TRUE TRUE TRUE FALSE TRUE
我怎样才能继续这一点,每一个帮助都很重要
答案 0 :(得分:1)
我们paste
collapse
"|"
可以stringr::str_detect(as.character(dat$v),paste(as.character(dat1$v1), collapse="|"))
#[1] TRUE TRUE TRUE TRUE FALSE TRUE
模式数据集列(&#39; dat1 $ v1&#39;),这将查找任何匹配项。它基本上是说这些模式中的任何一个都在&#39; v&#39; &#39; dat&#39;
\\b
注意:为避免任何子字符串不匹配,最好用字边界包裹(pat <- paste0("\\b(", paste(as.character(dat1$v1), collapse="|"), ")\\b")
stringr::str_detect(as.character(dat$v), pat)
)
list
在OP的数据中似乎并非如此
如果模式列表很长,那么我们可以遍历模式,获得vector
个逻辑Reduce
和vector
它到单个Reduce(`|`, lapply(as.character(dat1$v1), str_detect, string = as.character(dat$v)))
#[1] TRUE TRUE TRUE TRUE FALSE TRUE
gapi.client.gmail.users.messages.list
答案 1 :(得分:1)
此外,您可以使用sqldf
并以SQL格式执行此操作:
require(sqldf)
dat <- data.frame(v=c('apple', 'le123', 'app', 'being', 'aple','beiling'))
dat1 <- data.frame(v1=c('app','123', 'be'))
sqldf("SELECT dat.* FROM dat JOIN dat1 on dat.v like ('%' || dat1.v1 || '%')")
结果将是:
v
1 apple
2 le123
3 app
4 being
5 beiling