2011-11-02 66 views
13

我想在Rdata.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 

要完成這個問題,我必須創建兩個不必要的data.frames。我想知道一種方法,可以在原始data.frame中添加一列按因子列的方式,而不會創建任何額外的data.frames。感謝您的時間和幫助。

回答

12

這是ave函數的用途。這樣做的

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

這就是我一直在尋找。謝謝 – MYaseen208

7

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 
4

Joran回答精美,這是不是一個回答你的問題,但對話的延伸。如果你正在尋找的方式表兩個分類變量的一個依賴關係,這裏是爲哈德利功能:

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

這裏的CO2數據的頭圖,一看意指表:

> 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

兩種可選的方式:

1.dplyr包:

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

2.data.table包:

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

均可以得到以下結果:

> 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 
相關問題