部分逐行匹配两个向量

时间:2015-11-01 05:42:17

标签: r

我想说明x中是否包含y,最好不使用循环。我尝试了以下但它产生了一个错误。

df$flag <- ifelse(grep(df$x, df$y), 1, 0)

以下是示例:

df <- data.frame(id=seq(1,3,1),x=c("abc","efd","xyz"), y=(c("abc,efd","hig,mno","abc,xyz")))

3 个答案:

答案 0 :(得分:3)

您还可以使用 stringi 函数stri_detect_fixed()。它的字符串和模式参数都是矢量化的,非常快,并且不会受到将大量行粘贴在一起时可能出现的最大正则字符数的限制(我通过粘贴30k行发现这一点,这会返回grepl())中的无效正则表达式错误。

df$flag <- as.integer(stringi::stri_detect_fixed(df$y, df$x))
df
#   id   x       y flag
# 1  1 abc abc,efd    1
# 2  2 efd hig,mno    0
# 3  3 xyz abc,xyz    1

另一种选择,虽然是循环,但是mapply()

df$flag <- as.integer(mapply(grepl, df$x, df$y))

答案 1 :(得分:1)

我们paste将'x'列合在一起,将其用作pattern来查找与'y'列中的模式匹配的元素。 grepl返回一个逻辑向量,可以通过用+换行来强制转换为二进制。

df$flag <- +(grepl(paste0(df$x, collapse='|'), df$y))
df
#  id   x       y flag
#1  1 abc abc,efd    1
#2  2 efd hig,mno    0
#3  3 xyz abc,xyz    1

为了安全起见,我们也可以使用单词边界,使其与单词中的任何模式都不匹配

 +(grepl(paste0('\\b(', paste0(df$x, collapse='|'), ')\\b'), df$y))

答案 2 :(得分:0)

如果您知道您的模式总是用逗号分隔,则不需要正则表达式。

then()