我有一个数据框,我想创建一个新列,它给出按因子分组的数字变量的总和。所以像这样:
在:
data1 <- data.frame(month = c(1, 1, 2, 2, 3, 3),
sex = c("m", "f", "m", "f", "m", "f"),
value = c(10, 20, 30, 40, 50, 60))
在:
data2 <- data.frame(month = c(1, 1, 2, 2, 3, 3),
sex = c("m", "f", "m", "f", "m", "f"),
value = c(10, 20, 30, 40, 50, 60),
sum = c(30, 30, 70, 70, 110, 110))
在Stata中,您可以非常轻松地使用egen
命令执行此操作。我已经尝试了聚合函数和ddply函数,但它们创建了全新的数据框,我只想在现有函数中添加一列。
答案 0 :(得分:3)
您正在寻找ave
> data2 <- transform(data1, sum=ave(value, month, FUN=sum))
month sex value sum
1 1 m 10 30
2 1 f 20 30
3 2 m 30 70
4 2 f 40 70
5 3 m 50 110
6 3 f 60 110
如果您不想使用data1$sum <- ave(data1$value, data1$month, FUN=sum)
, transform
非常有用
data.table
也很有帮助
library(data.table)
DT <- data.table(data1)
DT[, sum:=sum(value), by=month]
<强> 更新 强>
我们也可以使用简单而优雅的tidyverse
方法:
> library(tidyverse)
> data1 %>%
group_by(month) %>%
mutate(sum=sum(value))
# A tibble: 6 x 4
# Groups: month [3]
month sex value sum
<dbl> <fct> <dbl> <dbl>
1 1 m 10 30
2 1 f 20 30
3 2 m 30 70
4 2 f 40 70
5 3 m 50 110
6 3 f 60 110