R 按组对变量求和&;创建具有频率的新列
我有两列数据。第一个是id,第二个是值。 同一id可能会多次出现。 我需要通过对相同id的所有值求和来聚合数据,并且我想创建一个具有相同id出现次数的新列 例如: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 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())
使用baseR
,可以像这样组合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使用baseR
,可以像这样组合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=列表(总和,长度))