使用data.table [,, by = ...]时包括所有排列

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中?

Jos*_*ien 3

我也会使用交叉连接,但会在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 withoutgrouping by。因此,自连接与 相同。jibyiDT[data.table(unique(colA)),j]DT[,j,by=colA]

  • 请注意:这里有一个[FR](https://r-forge.r-project.org/tracker/index.php?func=detail&amp;aid=2696&amp;group_id=240&amp;atid=978),我们计划移动“by-without” -by` 到 `by`。也就是说,“X[Y]”应该**只是一个连接**,如果想要复制旧的行为,那么需要执行:“X[, j, by=Y, mult=, nomatch=] `(或类似的东西)。这是为了保持与“by”始终执行“by”工作的一致性,并且不会被“i”仅在一种情况下执行“by”所污染。 (3认同)