通过在另一列的拆分中存在一列来过滤data.table行。

时间:2019-04-03 12:08:29

标签: r data.table strsplit

我有一个数据表:

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创建新列或合并数据表,但是对于如此看似简单的任务,所有这些都有些乏味。有什么建议么?

1 个答案:

答案 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, ",")))]