我使用聚合函数来按组计数。如果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
感谢您提前帮助
答案 0 :(得分:5)
我们可以创建另一个列'ind',然后使用dcast
从'long'重新整形为'wide',将fun.aggregate
指定为length
和drop=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