r语言 - 按组对变量求和并创建新列的频率



我有两列数据。第一个是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

谢谢

我们可以使用data.table。将"data.frame"转换为"data.table"(setDT(df1)),按"id"分组,得到"value"的sum以及具有(.N)的行数

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

或者正如@Frank评论

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

dplyr的类似方法

library(dplyr)
df1 %>%
group_by(id) %>%
summarise(value = sum(value), freq = n())

使用基本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))

最新更新