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

R 按组对变量求和&;创建具有频率的新列,r,aggregate,R,Aggregate,我有两列数据。第一个是id,第二个是值。 同一id可能会多次出现。 我需要通过对相同id的所有值求和来聚合数据,并且我想创建一个具有相同id出现次数的新列 例如: id value 1 15 1 10 2 5 3 7 1 4 3 12 4 16 我知道我可以使用aggregate对值求和,并将表减少到4行,但我希望有一个额外的列,其中包含id的出现次数,如下所示: id value freq 1 29 3 2 5 1

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

例如:

id  value
1   15
1   10
2   5
3   7
1   4
3   12
4   16
我知道我可以使用aggregate对值求和,并将表减少到4行,但我希望有一个额外的列,其中包含id的出现次数,如下所示:

id   value   freq
1     29      3
2      5      1
3     19      2
4     16      1
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

谢谢

我们可以使用
数据表
。将“data.frame”转换为“data.table”(
setDT(df1)
),按“id”分组,获取“value”的
和以及(
.N
)的行数

或者像@Frank评论的那样

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

或者使用
dplyr

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

我们可以使用
data.table
。将“data.frame”转换为“data.table”(
setDT(df1)
),按“id”分组,获取“value”的
和以及(
.N
)的行数

或者像@Frank评论的那样

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

或者使用
dplyr

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

使用base
R
,可以像这样组合
aggregate()
table()

id   value   freq
1     29      3
2      5      1
3     19      2
4     16      1
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))

df1使用base
R
,可以像这样组合
aggregate()
table()

id   value   freq
1     29      3
2      5      1
3     19      2
4     16      1
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))

df1您还可以执行
do.call(data.frame、aggregate(.~id、df1、函数(x)c(sum(x)、length(x)))
Nice alternative,@akrun。非常感谢。但我认为,在这种情况下,我还必须担心列名。是的,你说得对。@DellactiatusMaximus,这会让你的结构变得混乱(看看str)非常感谢你。你也可以做
do.call(data.frame,aggregate(.~id,df1,function(x)c(sum(x),length(x))
不错的选择,@akrun。非常感谢。但是我认为,在这种情况下,我还必须担心列名。是的,你说得对。@DellatiatusMaximus,这给你留下了一个混乱的结构(看看str)非常感谢你我猜是另一个数据。表方式是
dcast(DF,id~,fun=list(sum,length))
我猜是另一个数据。表方式是
dcast(DF,id~,fun=列表(总和,长度))