按组添加一列均值到原始数据

MYa*_*208 18 r dataframe

我想基于因子列添加一列均值R data.frame.像这样:

df1 <- data.frame(X = rep(x = LETTERS[1:2], each = 3), Y = 1:6)
df2 <- aggregate(data = df1, Y ~ X, FUN = mean)
df3 <- merge(x = df1, y = df2, by = "X", suffixes = c(".Old",".New"))
df3
#   X Y.Old Y.New
# 1 A     1     2
# 2 A     2     2
# 3 A     3     2
# 4 B     4     5
# 5 B     5     5
# 6 B     6     5
Run Code Online (Sandbox Code Playgroud)

要完成这个问题,我要创建两个不必要的data.frames.我想知道一种方法,可以通过因子列将一列方法附加到我的原始列中data.frame而不创建任何额外的data.frames.谢谢你的时间和帮助.

Joh*_*ohn 18

这就是该ave功能的用途.

df1$Y.New <- ave(df1$Y, df1$X)
Run Code Online (Sandbox Code Playgroud)


Jaa*_*aap 15

两种替代方法:

1.使用包:

library(dplyr)
df1 <- df1 %>% 
  group_by(X) %>% 
  mutate(Y.new = mean(Y))
Run Code Online (Sandbox Code Playgroud)

2.使用包:

library(data.table)
setDT(df1)[, Y.new := mean(Y), by = X]
Run Code Online (Sandbox Code Playgroud)

两者都给出以下结果:

> df1
   X Y Y.new
1: A 1     2
2: A 2     2
3: A 3     2
4: B 4     5
5: B 5     5
6: B 6     5
Run Code Online (Sandbox Code Playgroud)


jor*_*ran 8

ddplytransform拯救(虽然我相信你至少会有4种不同的方式来做到这一点):

library(plyr)
ddply(df1,.(X),transform,Y.New = mean(Y))
  X Y Y.New
1 A 1     2
2 A 2     2
3 A 3     2
4 B 4     5
5 B 5     5
6 B 6     5
Run Code Online (Sandbox Code Playgroud)