2011-11-02 9 views
13

Chcę dodać kolumnę średnich opartą na kolumnie czynnikowej w Rdata.frame. Tak:Dodawanie kolumny średnich przez grupę do oryginalnych danych

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 

Aby osiągnąć ten problem mam już stworzyć dwa niepotrzebne data.frames. Chciałbym wiedzieć, w jaki sposób dodać kolumnę średnich za pomocą kolumny czynnikowej do mojego oryginalnego data.frame bez tworzenia dodatkowego data.frames. Dziękuję za poświęcony czas i pomoc.

Odpowiedz

12

Do tego służy funkcja ave.

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

To właśnie szukałem. Dzięki – MYaseen208

7

ddply i transform na ratunek (choć jestem pewien, że masz co najmniej 4 różne sposoby, aby to zrobić):

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 odpowiedziano pięknie, to nie jest odpowiedź na pytanie, ale przedłużenie rozmowy. Jeśli szukasz spisu środków do relacji two kategoryczny zmiennej na utrzymaniu oto funkcja Hadley za to:

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

Oto widok szef danych CO2, a spojrzenie na tabeli oznaczają:

> 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

dwa alternatywne sposoby osiągnięcia tego celu:

1. z dplyr pakietu:

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

2. z pakietem data.table:

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

zarówno dać następujący wynik:

> 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