按组&和变量求和创建具有频率的新列

时间:2016-06-13 15:37:28

标签: r aggregate

我有2列数据。第一个是id,第二个是值。 可能会出现多次相同的id。 我需要通过对相同id的所有值求和来聚合数据,并且我想创建一个具有相同id出现次数的新列。

例如:

id  value
1   15
1   10
2   5
3   7
1   4
3   12
4   16

我知道我可以使用聚合来对值求和并将表格减少到4行,但我想要一个额外的列,其中包含id的出现次数:

id   value   freq
1     29      3
2      5      1
3     19      2
4     16      1

谢谢

2 个答案:

答案 0 :(得分:3)

我们可以使用data.table。将'data.frame'转换为'data.table'(setDT(df1)),按'id'分组,获取'{1}}的'value'以及行数(sum })

.N

或者@Frank发表评论

library(data.table)
setDT(df1)[, .(value=sum(value), freq = .N) , by = id]
#    id value freq
#1:  1    29    3
#2:  2     5    1
#3:  3    19    2
#4:  4    16    1

使用dcast(setDT(df1), id ~ ., fun = list(sum, length))

的类似方法
dplyr

答案 1 :(得分:3)

使用基础R,可以将aggregate()table()组合在一起:

cbind(aggregate(value ~ id, df1, sum), freq=as.vector(table(df1$id)))
#  id value freq
#1  1    29    3
#2  2     5    1
#3  3    19    2
#4  4    16    1

此示例中使用的数据:

df1 <- structure(list(id = c(1L, 1L, 2L, 3L, 1L, 3L, 4L), 
                 value = c(15L, 10L, 5L, 7L, 4L, 12L, 16L)), 
                 .Names = c("id", "value"), class = "data.frame", 
                 row.names = c(NA, -7L))