我有以下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
中的所有值。
所以返回值为11
和12
。
我想出了以下代码,但我认为它不够高效:
dt1[, sum(A %in% dt_filter) == 3, by = C][V1 == T, C]
能给我一些建议吗?
答案 0 :(得分:2)
首先对所有组进行过滤(否则,您将在每个组上运行单独的过滤器,由于这样做会产生一些开销,因此效率低下):
dt1[A %in% 1:3, if (.N == 3L) TRUE, keyby = C]$C
如果A
在C
中可能不是唯一的:
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,则可能会破坏