R ::按组添加总和的新列

时间:2013-11-21 00:30:33

标签: r

假设我有一个这样的数据框:

set.seed(123)
df <- as.data.frame(cbind(y<-sample(c("A","B","C"),10,T), X<-sample(c(1,2,3),10,T)))
df <- df[order(df$V1),]

是否有简单的函数可以将V1求和(或任何FUN)V2并添加到df作为新列,这样:

df$sum <- c(6,6,8,8,8,8,6,6,6,6)
df

我可能会为此编写一个函数,但我必须经常这样做,并且最好知道实现它的最简单方法。

1 个答案:

答案 0 :(得分:7)

至少在他的第一点上我同意@mnel。我没有在他引用的答案中看到ave,我认为这是“最简单”的基础R方法。应该禁止使用data.frame(cbind( ...))构造,并且应该剥夺证明它的教师。

set.seed(123)
 df<-data.frame(y=sample( c("A","B","C"), 10, T), 
                X=sample(c (1,2,3), 10, T))
  df<-df[order(df$y),]  # that step is not necessary for success.
df

 df$sum <- ave(df$X, df$y, FUN=sum)
 df
   y X sum
1  A 3   6
6  A 3   6
3  B 3   8
7  B 1   8
9  B 1   8
10 B 3   8
2  C 2   6
4  C 2   6
5  C 1   6
8  C 1   6