在R中,当计数为零时按计数分组

4
我使用聚合函数按组获取计数。如果计数> 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

提前感谢您的帮助
4个回答

6
我们可以创建另一列 'ind',然后使用 dcast 将数据从 '长格式' 转化为 '宽格式',并将 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

或者使用基础 R 选项:

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

3
您可以将您的“my.count”对象与完整的“id”和“group”列集合进行合并:
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

aggregate 带有 drop=FALSE 参数对我很有用。

my.count <- aggregate(n ~ id+group, dt, length, drop=FALSE)
my.count[is.na(my.count)] <- 0
my.count
#   id group n
# 1  A     x 2
# 2  B     x 3
# 3  A     y 1
# 4  B     y 0

0
如果您只对频率感兴趣,可以使用您的公式创建一个频率表并将其转换为数据框:
as.data.frame(xtabs(formula = ~ id + group, dt))

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接