我有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
谢谢
答案 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))