我希望拥有数据表的所有组的交集。所以对于给定的数据:
data.table(a=c(1,2,3, 2, 3,2), myGroup=c("x","x","x", "y", "z","z"))
我想得到结果:
2
我知道
Reduce(intersect, list(c(1,2,3), c(2), c(3,2)))
会给我想要的结果,但我没有弄清楚如何生成data.table查询的组列表。
答案 0 :(得分:6)
我会尝试以下列方式使用Reduce
(假设dt
是您的数据)
Reduce(intersect, dt[, .(list(unique(a))), myGroup]$V1)
## [1] 2
答案 1 :(得分:2)
这是一种方法。
nGroups <- length(unique(dt[,myGroup]))
dt[, if(length(unique(myGroup))==nGroups) .BY else NULL, by="a"][[1]]
# [1] 2
这里有一些解释性的评论。
## Mark down the number of groups in your data set
nGroups <- length(unique(dt[,myGroup]))
## Then, use `by="a"` to examine in turn subsets formed by each value of "a".
## For subsets having the full complement of groups
## (i.e. those for which `length(unique(myGroup))==nGroups)`,
## return the value of "a" (stored in .BY).
## For the other subsets, return NULL.
dt[, if(length(unique(myGroup))==nGroups) .BY else NULL, by="a"][[1]]
# [1] 2
如果该代码和评论本身不明确,请快速浏览以下内容可能会有所帮助。基本上,上述方法只是为下面a
列中返回x,y,z
的群组寻找并报告V1
的值。
dt[,list(list(unique(myGroup))), by="a"]
# a V1
# 1: 1 x
# 2: 2 x,y,z
# 3: 3 x,z