如何通过将条件与向量匹配来选择data.table中的行

时间:2019-02-15 10:19:08

标签: r data.table

我有以下data.table:

dt1 <- data.table(A=c(1,2,3,1,2,3,1,2,2,3),
                  B=c(8,4,3,1,1,5,9,7,1,1),
                  C=c(11,11,11,12,12,12,13,13,14,14))

和矢量:

dt_filter <- c(1,2,3)

我想选择C中的dt1列,其中A列包含向量dt_filter中的所有值。

所以返回值为1112

我想出了以下代码,但我认为它不够高效:

dt1[, sum(A %in% dt_filter) == 3, by = C][V1 == T, C]

能给我一些建议吗?

2 个答案:

答案 0 :(得分:2)

首先对所有组进行过滤(否则,您将在每个组上运行单独的过滤器,由于这样做会产生一些开销,因此效率低下):

dt1[A %in% 1:3, if (.N == 3L) TRUE, keyby = C]$C

如果AC中可能不是唯一的:

dt1[A %in% 1:3, if (length(unique(A)) == 3L) TRUE, keyby = C]$c

预排序可能会有所帮助:

setkey(dt1, A)
dt1[.(1:3), if (.N == 3L) TRUE, keyby = C]$C

也可以与unique结合使用:

unique(dt1[.(1:3)], by = c('A', 'C'))[ , if (.N == 3L) TRUE, keyby = C]$C

答案 1 :(得分:0)

dt1[, .(check = all(dt_filter %in% A)), by = C][check == TRUE, C]

我认为这样可以更好地解决问题,因为您的方法将检查是否存在3个,但是数据表明可以重复进行,因此如果C = 13的A = 1,1,2,则可能会破坏