用聚合保留零长度组

问题描述 投票:0回答:2

我刚刚注意到聚合从结果中消失了空组,我该如何解决这个问题?例如

`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)
具有相同的行为,即使对于没有观测的水平也能给出频率。

r aggregate
2个回答
2
投票

我们可以仅使用“xx”的

data.frame
创建另一个
levels
,然后使用
merge
创建
aggregate
。输出将包含所有“组”,而与其他列的缺失级别对应的行将为 NA。

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

另一种选择可能是使用

melt
转换为“长”格式,然后使用
dcast
fun.aggregate
作为“总和”和
drop=FALSE

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

0
投票

从R 3.5.0开始,添加了新参数“drop”, 因此,使用以下代码

 aggregate(z, by = list(groups = xx), sum,drop=F)

将显示未使用的组合。

© www.soinside.com 2019 - 2024. All rights reserved.