我有一个数据表:
dt <- data.table(col1=c('aa,bb', 'bb,cc,ee', 'dd,ee'), col2=c('aa', 'cc', 'aa'))
> dt
col1 col2
1: aa,bb aa
2: bb,cc,ee cc
3: dd,ee aa
我想检查第二列是否出现在第一列的strsplit中,因此对于第一行,如果aa
中出现aa,bb
,并用逗号分隔,这是正确的。第二行也是如此,第三行则为false。我只想保留发生这种情况的行,所以只保留行1和2。
我的第一个想法就是这样做:
dt[col2 %in% strsplit(col1, ',')]
但是,这将返回一个空的data.table。
我可以想到多种解决方案来解决此问题,包括使用tstrsplit
创建新列或合并数据表,但是对于如此看似简单的任务,所有这些都有些乏味。有什么建议么?
答案 0 :(得分:1)
我们可以使用str_detect
中的stringr
library(stringr)
dt[, flag := str_detect(col1, col2)]
dt
# col1 col2 flag
#1: aa,bb aa TRUE
#2: bb,cc,ee cc TRUE
#3: dd,ee aa FALSE
此外,为避免子字符串匹配,我们可以指定单词边界(\\b
)
dt[, str_detect(col1, str_c("\\b", col2, "\\b"))]
#[1] TRUE TRUE FALSE
关于strsplit
的使用,输出将是list
中的vector
。因此,我们需要使用一个函数来检查'{1}的相应元素中'col1'的值。 list
做到了
Map
要在同一步骤中应用过滤器并返回2行数据表。
dt[, unlist(Map(`%in%`, col2, strsplit(col1, ",")))]