R中各组的变量总和

时间:2013-05-22 20:45:23

标签: r grouping stata

我有一个数据框,我想创建一个新列,它给出按因子分组的数字变量的总和。所以像这样:

在:

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函数,但它们创建了全新的数据框,我只想在现有函数中添加一列。

1 个答案:

答案 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