2013-04-06 29 views
3

我正在嘗試獲取數據框中每個子集的平均值,並將該信息合併到列中。適用的可變版本?

我可以用lapply做到這一點,但我不能讓它「堅持」。有副作用的應用功能家族的變種嗎? plyr庫中的任何東西都可以。

data <- data.frame(
    A = sample(LETTERS[1:3], 20, replace=TRUE), 
    B = runif(20), 
    C = LETTERS[1:20]) 
# split by A 
dataByA <- split(data, factor(data$A)) 
# get average of B per set 
lapply(dataByA, function(df) {df$Bmean <- mean(df$B)}) # does nothing! 
# remerge subsets 
data <- rbind.fill(dataByA) 

感謝

回答

3

這可能工作:

library(plyr) 
data1<-ddply(data,.(A),transform,Bmean=mean(B)) 


head(data1) 
A   B C Bmean 
1 A 0.616156407 E 0.5492000 
2 A 0.568187293 G 0.5492000 
3 A 0.899395311 H 0.5492000 
4 A 0.113060973 K 0.5492000 
5 B 0.872838203 A 0.7885643 
6 B 0.906216467 B 0.7885643 
7 B 0.944196701 N 0.7885643 
8 B 0.445983319 O 0.7885643 
9 B 0.773586589 T 0.7885643 
+0

完美。我不熟悉轉換函數。謝謝! – sharoz 2013-04-06 00:45:54

+0

很高興它的工作。 – Metrics 2013-04-06 00:49:47

5

有對這樣的事情很多選擇,但要糾正你的錯誤,立即在lapply您的匿名函數根本不返回任何東西。只是使它恢復它在操作片:

{df$Bmean <- mean(df$B); df} 

我將它留給羣衆使用byddply + mutatetransformdata.table向你展示你的選擇。

8

嘗試這種情況:

data$Bmean <- ave(data$B, data$A) 
2

作爲每@joran,我會羣衆中的一個;) 在data.table溶液如下

DT[ , Bmean := mean(B), by=A] 

其中DT簡直就是

library(data.table) 
DT <- data.table(<your data frame>) 
+0

@ G.Grothendieck是正確的 – sharoz 2013-04-06 21:49:19

+0

@ G.Grothendieck,謝謝你指出了這一點。修復了答案。 – 2013-04-07 11:46:37

相關問題