如果第一列中的任何值与R中的另一列匹配(部分/全部)

时间:2018-03-16 06:58:26

标签: r regex dplyr data.table stringr

我有两个列表,如下所示。我正在寻找一个输出,其中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

我怎样才能继续这一点,每一个帮助都很重要

2 个答案:

答案 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个逻辑Reducevector它到单个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