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