假设我有一个这样的数据框:
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
我可能会为此编写一个函数,但我必须经常这样做,并且最好知道实现它的最简单方法。
答案 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