检查R

时间:2019-07-12 21:39:43

标签: r

我正在使用字符串R。我的数据框DF具有下一个结构:

DF <- data.frame(v1=c(1,2,3),v2=c("Oranges are fruits","Hit music","Ferrari is red"),stringsAsFactors = F)

  v1                 v2
1  1 Oranges are fruits
2  2          Hit music
3  3     Ferrari is red

我有一个向量d,其中包含:

d <- c("fruits","red")

我正在寻找一种测试v2中的所有字符串是否与d一致的方法。这样,我尝试了下一个代码:

DF$v3 <- grepl(d,DF$v2)

但是我得到这个结果:

  v1                 v2    v3
1  1 Oranges are fruits  TRUE
2  2          Hit music FALSE
3  3     Ferrari is red FALSE

这是不正确的,因为v2第三行中的字符串包含red中包含的单词d。有什么办法可以得到这样的输出:

  v1                 v2    v3
1  1 Oranges are fruits  TRUE
2  2          Hit music FALSE
3  3     Ferrari is red  TRUE

我的原始数据集较大,DF是其中的一个示例。非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

?grepl开始,关于pattern参数:

  

如果提供了长度为2或更大的字符向量,则使用第一个元素

因此提供长度2 d只会搜索fruits

要查看d中的任何字符串是否匹配,可以对any和迭代使用一种方法,也可以使用d符号将|折叠为用作以下模式。请注意,在此示例中,类似于“他被禁止”的句子将与“红色”匹配。

DF <- data.frame(v1 = c(1, 2, 3), v2 = c("Oranges are fruits", "Hit music", "Ferrari is red"), stringsAsFactors = F)
d <- c("fruits", "red")

DF$v3 <- grepl(paste0(d, collapse = "|"), DF$v2)
DF
#>   v1                 v2    v3
#> 1  1 Oranges are fruits  TRUE
#> 2  2          Hit music FALSE
#> 3  3     Ferrari is red  TRUE

reprex package(v0.3.0)于2019-07-12创建

答案 1 :(得分:0)

一种方法是将applygrepl一起使用两次。基本上,它正在执行double for循环。对于v2中的每个元素,都将grepl应用于d的每个元素。

DF$v3 <- sapply(DF$v2, FUN = function(s) any(sapply(d, FUN = grepl, s)))
DF