R - 测试字符串向量是否包含另一个列表的任何元素

时间:2018-06-04 01:02:11

标签: r string data.table grepl contain

我有:

> lst_A <- c("TET","RNR")
> DT_result <- data.table(lst_B = c("RNR_B","BC_TET"))

我想:

> DT_result <- data.table(lst_B = c("RNR_B","BC_TET"), result = c(TRUE,TRUE))
> DT_result
    lst_B result
1:  RNR_B   TRUE
2: BC_TET   TRUE

基本上,对于'lst_B'中的每个元素,如果它包含'lst_A'中的任何元素,则为TRUE,否则为FALSE。

4 个答案:

答案 0 :(得分:6)

您可以使用grepl来获取此内容。

lst_A <- c("TET","RNR")
lst_B = c("RNR_B","BC_TET")

Pattern = paste(lst_A, collapse="|")
grepl(Pattern, lst_B)

library(data.table)
DT_result <- data.table(lst_B, result=grepl(Pattern, lst_B))
DT_result
    lst_B result
1:  RNR_B   TRUE
2: BC_TET   TRUE

加成

要回复评论,这是一个包含更多要测试的字符串的示例。有些人通过考试,有些则没有。

lst_A <- c("TET","RNR")
lst_B = c("RNR_B","BC_TET", "Fred", "RNR_A", "Zero", "ABC_TET")

Pattern = paste(lst_A, collapse="|")

DT_result <- data.table(lst_B, result=grepl(Pattern, lst_B))
DT_result
     lst_B result
1:   RNR_B   TRUE
2:  BC_TET   TRUE
3:    Fred  FALSE
4:   RNR_A   TRUE
5:    Zero  FALSE
6: ABC_TET   TRUE

答案 1 :(得分:4)

    DT_result[,results:=sapply(lst_A,function(x)any(grepl(x,lst_B)))][]
    lst_B results
1:  RNR_B    TRUE
2: BC_TET    TRUE

答案 2 :(得分:1)

使用grepl循环覆盖每个选项,然后与|('OR')结合使用:

DT_result[, hit := Reduce(`|`, Map(grepl, lst_A, .(lst_B)))]
DT_result

#    lst_B  hit
#1:  RNR_B TRUE
#2: BC_TET TRUE

答案 3 :(得分:1)

使用stringr的{​​{1}}

str_detect