R - 测试字符串向量是否包含另一个列表的任何元素
R - test if a string vector contains any element of another list
我有:
> 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。
您可以使用 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
DT_result[,results:=sapply(lst_A,function(x)any(grepl(x,lst_B)))][]
lst_B results
1: RNR_B TRUE
2: BC_TET TRUE
用 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
使用 stringr
的 str_detect
stringr::str_detect(DT_result$lst_B,'TET|RNR')
[1] TRUE TRUE
#DF['hit']=stringr::str_detect(DT_result$lst_B,'TET|RNR')
我有:
> 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。
您可以使用 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
DT_result[,results:=sapply(lst_A,function(x)any(grepl(x,lst_B)))][]
lst_B results
1: RNR_B TRUE
2: BC_TET TRUE
用 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
使用 stringr
的 str_detect
stringr::str_detect(DT_result$lst_B,'TET|RNR')
[1] TRUE TRUE
#DF['hit']=stringr::str_detect(DT_result$lst_B,'TET|RNR')