在r中计数为零时按计数分组

时间:2015-12-18 04:41:26

标签: r aggregate

我使用聚合函数来按组计数。如果count> gt,则聚合函数仅返回组的计数。这就是我所拥有的

dt <- data.frame(
n  = c(1,2,3,4,5,6),
id = c('A','A','A','B','B','B'),
group = c("x","x","y","x","x","x")) 

应用聚合函数

my.count <- aggregate(n ~ id+group, dt, length)

现在看到结果

my.count[order(my.count$id),]

我得到了以下

id group   n
1  A     x 2
3  A     y 1
2  B     x 3

我需要以下内容(最后一行是零,我需要)

id group   n
1  A     x 2
3  A     y 1
2  B     x 3
4  B     y 0

感谢您提前帮助

3 个答案:

答案 0 :(得分:5)

我们可以创建另一个列'ind',然后使用dcast从'long'重新整形为'wide',将fun.aggregate指定为lengthdrop=FALSE

library(reshape2)
dcast(transform(dt, ind='n'), id+group~ind,
           value.var='n', length, drop=FALSE)
#  id group n
#1  A     x 2
#2  A     y 1
#3  B     x 3
#4  B     y 0

base R选项

 as.data.frame(table(dt[-1]))

答案 1 :(得分:3)

您可以使用完整的“id”和“group”列merge“my.count”对象:

merge(my.count, expand.grid(lapply(dt[c("id", "group")], unique)), all = TRUE)
##   id group  n
## 1  A     x  2
## 2  A     y  1
## 3  B     x  3
## 4  B     y NA

有几个关于SO的问题向您展示了如果需要将NA替换为0。

答案 2 :(得分:0)

如果您只对频率感兴趣,可以使用公式创建频率表并将其转换为数据帧:

as.data.frame(xtabs(formula = ~ id + group, dt))

显然,这对其他集合功能不起作用。我还在等待dplyr的汇总功能让用户决定是否保留零组。也许你可以在这里投票支持这项改进:https://github.com/hadley/dplyr/issues/341