Adicionando uma coluna de médias por grupo aos dados originais

Eu quero adicionar uma coluna de médias com base na coluna do fator em R data.frame . Como isso:

 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 

Para realizar esse problema, eu tenho que criar dois data.frames desnecessários. Gostaria de saber uma maneira de acrescentar uma coluna de médias por coluna de fator ao meu data.frame original sem criar qualquer data.frames extra. Obrigado pelo seu tempo e ajuda.

É para isso que serve a function ave .

 df1$Y.New < - ave(df1$Y, df1$X) 

Duas formas alternativas de fazer isso:

1. com o pacote dplyr :

 library(dplyr) df1 < - df1 %>% group_by(X) %>% mutate(Y.new = mean(Y)) 

2. com o pacote data.table :

 library(data.table) setDT(df1)[, Y.new := mean(Y), by = X] 

ambos dão o seguinte resultado:

 > df1 XY 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 

ddply e transform para o resgate (embora eu tenho certeza que você vai ter pelo menos 4 maneiras diferentes de fazer isso):

 library(plyr) ddply(df1,.(X),transform,Y.New = mean(Y)) XY 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 

Joran respondeu lindamente: Esta não é uma resposta à sua pergunta, mas uma extensão da conversa. Se você está procurando uma tabela de médias para o relacionamento de duas variables ​​categóricas com um dependente, aqui está a function Hadley para isso:

 cast(CO2, Type ~ Treatment, value="uptake", fun.aggregate=mean, margins=TRUE) 

Aqui está uma visão de cabeça dos dados de CO2 e uma olhada na tabela de meios:

 > head(CO2) Plant Type Treatment conc uptake 1 Qn1 Quebec nonchilled 95 16.0 2 Qn1 Quebec nonchilled 175 30.4 3 Qn1 Quebec nonchilled 250 34.8 4 Qn1 Quebec nonchilled 350 37.2 5 Qn1 Quebec nonchilled 500 35.3 6 Qn1 Quebec nonchilled 675 39.2 > library(reshape) > cast(CO2, Type ~ Treatment, mean, margins=TRUE) Type nonchilled chilled (all) 1 Quebec 35.33333 31.75238 33.54286 2 Mississippi 25.95238 15.81429 20.88333 3 (all) 30.64286 23.78333 27.21310