2015-12-18 78 views
2

我使用聚合函数按组进行计数。聚集函数只返回计数的团体,如果计数> 0。这是我当计数为零时,按组计数0

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

您可以用一套完整的“身份证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 

上有让您展示如何如果需要用0来代替NA几个问题。

5

我们可以创建另一列“IND”,然后用dcast从“长”到“宽”重塑,指定fun.aggregatelengthdrop=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])) 
0

如果你有兴趣的频率而已,你和你的公式创建一个频率表中把它变成一个数据帧:

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

显然这不适用于其他聚合函数。我仍然在等待dplyr的总结功能,让用户决定是否保留零组。也许你可以在这里为这项改进投票:https://github.com/hadley/dplyr/issues/341