我正在使用字符串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
是其中的一个示例。非常感谢您的帮助。
答案 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)
一种方法是将apply
与grepl
一起使用两次。基本上,它正在执行double for循环。对于v2中的每个元素,都将grepl应用于d的每个元素。
DF$v3 <- sapply(DF$v2, FUN = function(s) any(sapply(d, FUN = grepl, s)))
DF