2

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

前:

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

4

1 回答 1

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
于 2013-05-22T20:50:00.360 回答