我有一个大 data.table
我正在使用 ,by
折叠到月份级别.
vars 有 5 个,级别数为:c(4,3,106,3,1380)
. 106 是月,1380 是地理单位。事实证明有一些 0,因为有些单元格没有值。 by
丢弃这些,但我希望保留它们。
可重现的例子:
require(data.table)
set.seed(1)
n <- 1000
s <- function(n,l=5) sample(letters[seq(l)],n,replace=TRUE)
dat <- data.table( x=runif(n), g1=s(n), g2=s(n), g3=s(n,25) )
datCollapsed <- dat[ , list(nv=.N), by=list(g1,g2,g3) ]
datCollapsed[ , prod(dim(table(g1,g2,g3))) ] # how many there should be: 5*5*25=625
nrow(datCollapsed) # how many there are
是否有一种有效的方法可以用 0 填充这些缺失值,以便通过变量的所有排列都在结果折叠的 data.table 中?
最佳答案
对唯一值进行笛卡尔连接,并使用它连接回您的结果
dat.keys <- dat[,CJ(g1=unique(g1), g2=unique(g2), g3=unique(g3))]
setkey(datCollapsed, g1, g2, g3)
nrow(datCollapsed[dat.keys]) # effectively a left join of datCollapsed onto dat.keys
# [1] 625
请注意,现在缺失的值是 NA,但如果需要,您可以轻松地将其更改为 0。
关于r - 使用 data.table[,,by=...] 时包括所有排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20914284/