Ari*_*man 5 r collapse data.table
我有一个大的data.table,我正在崩溃到月级使用,by.
有5个vars,有#个级别: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
Run Code Online (Sandbox Code Playgroud)
是否有一种有效的方法用0来填充这些缺失值,以便所有by变量的排列都在最终的折叠data.table中?
我也会使用交叉连接,但会在i原始调用的 -slot中使用它[.data.table:
keycols <- c("g1", "g2", "g3") ## Grouping columns
setkeyv(dat, keycols) ## Set dat's key
ii <- do.call(CJ, sapply(dat[, ..keycols], unique)) ## CJ() to form index
datCollapsed <- dat[ii, list(nv=.N)] ## Aggregate
## Check that it worked
nrow(datCollapsed)
# [1] 625
table(datCollapsed$nv)
# 0 1 2 3 4 5 6
# 135 191 162 82 39 13 3
Run Code Online (Sandbox Code Playgroud)
这种方法被称为“by-without-by”,并且如 中所述?data.table,它与通过参数传递分组指令一样高效和快速by:
高级:将已知组的子集传递到 时,聚合特别有效
i。当i为 a 时data.table,对 的每一行DT[i,j]进行计算。我们称之为by without或grouping by。因此,自连接与 相同。jibyiDT[data.table(unique(colA)),j]DT[,j,by=colA]