使用聚合保留零长度组

时间:2016-03-17 06:31:16

标签: r aggregate

我刚注意到聚合从结果中消失了空组,我该如何解决? e.g。

`xx <- c("a", "b", "d", "a", "d", "a")
 xx <- factor(xx, levels = c("a", "b", "c", "d"))
 y <- rnorm(60, 5, 1)
 z <- matrix(y, 6, 10)
 aggregate(z, by = list(groups = xx), sum)`

xx是一个具有4个级别的因子变量,但结果只提供3行,并希望"c"级别的行为零。我希望table(xx)的相同行为即使对于没有观察的水平也能给出频率。

1 个答案:

答案 0 :(得分:2)

我们可以使用&{39} xx&#39;的data.frame创建另一个levels然后使用merge aggregate。输出将包含所有&#39;组。而对应于其他列的缺失级别的行将是NA。

merge(data.frame(groups=levels(xx)),
   aggregate(z, by = list(groups = xx), sum), all.x=TRUE)

另一个选择可能是转换为&#39; long&#39;格式为melt,然后将dcastfun.aggregate一起使用为&#39; sum&#39;和drop=FALSE

library(data.table)
dcast(melt(data.table(groups=xx, z), id.var='groups'), 
         groups~variable, value.var='value', sum, drop=FALSE)