2011-11-02 7 views
13

Desidero aggiungere una colonna di medie in base alla colonna dei fattori in Rdata.frame. Come questo:Aggiunta di una colonna di medie per gruppo ai dati originali

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 

per raggiungere questo problema che ho per creare due inutili data.frames. Mi piacerebbe sapere un modo per aggiungere una colonna di medie per colonna di fattori nel mio originale data.frame senza creare alcun data.frames extra. Grazie per il tuo tempo e aiuto.

risposta

12

Questo è ciò che la funzione ave è per.

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

Questo è quello che stavo cercando. Grazie – MYaseen208

7

ddply e transform in soccorso (anche se sono sicuro che avrai almeno 4 modi diversi per farlo):

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 
4

Joran risposto splendidamente, Questa non è una risposta alla tua domanda, ma un'estensione della conversazione. Se siete alla ricerca di tavolo di mezzi relazione due categorico di variabile a un dipendente ecco la funzione di Hadley per questo:

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

Ecco una vista di testa di dati di CO2, e uno sguardo alla tabella mezzi:

> 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 
9

Due modi alternativi di fare questo:

1. con il pacchetto dplyr:

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

2. con il pacchetto data.table:

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

sia il seguente risultato:

> 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