2011-03-26 48 views
2

我有一個20列的data.frame。前兩個是因素,其餘是數字。我想將前兩列用作分割變量,然後將mean()應用於其餘列。ddply如何處理「拆分」變量的因素?

對於ddply(),這看起來像一個快速簡單的工作,但是,輸出data.frame的結果並不是我正在尋找的。下面是隻用一個數據的列的最小例如:

Aa <- c(rep(c("A", "a"), each = 20)) 
Bb <- c(rep(c("B", "b", "B", "b"), each = 10)) 
x <- runif(40) 
df1 <- data.frame(Aa, Bb, x) 

ddply(df1, .(Aa, Bb), mean) 

的輸出是:

Aa Bb   x 
1 NA NA 0.5193275 
2 NA NA 0.4491907 
3 NA NA 0.4848128 
4 NA NA 0.4717899 
Warning messages: 
1: In mean.default(X[[1L]], ...) : 
    argument is not numeric or logical: returning NA 

警告重複8次,大概是一旦爲每個呼叫到mean()。我猜這是因爲試圖採取一個因素的意思。我可以這樣寫:

ddply(df1, .(Aa, Bb), function(df1) mean(df1$x)) 

ddply(df1, .(Aa, Bb), summarize, x = mean(x)) 

兩者做的工作(不給NAS),但我寧願避免編寫出18個這樣的x = mean(x)報表,每一個我的數字的列。

是否有一個通用的解決方案?如果在其他地方有更好的答案,我不會接受ddply

回答

6

因爲你是減少的行數興田,你需要使用summarise

> ddply(df1, .(Aa, Bb), summarise, mean_x =mean(x)) 
    Aa Bb mean_x 
1 a b 0.3790675 
2 a B 0.4242922 
3 A b 0.5622329 
4 A B 0.4574471 

這只是容易在這種情況下使用聚合。比方說,你有兩個變量:

> aggregate(df1[-(1:2)], df1[1:2], mean) 
    Aa Bb   x   y 
1 a b 0.4249121 0.4639192 
2 A b 0.6127175 0.4639192 
3 a B 0.4522292 0.4826715 
4 A B 0.5201965 0.4826715 
+2

作爲聚合所有,但自變量,嘗試:骨料(〜AA + BB,數據= DF1,平均) – kohske 2011-03-27 05:22:59

2

ddply支持負的索引,以及:

ddply(df1, .(Aa, Bb), function(x) mean(x[-(1:2)])) 
+1

這真的是「[」是處理這些指數。 – 2011-03-27 22:09:17

+0

@Dwin - 有效點。出於實際的目的,它是六合一,另一半是二打......還是我錯過了別的東西?我想這依賴於知道列的索引,你不想返回提前的「均值」。 – Chase 2011-03-27 23:51:19

+0

如果你不想「知道」什麼數字負面指定總是有的grep的()。像x [-grep(「Aa | Bb」,names(x))]應該起作用。 – 2011-04-24 16:30:50