2012-02-28 196 views
21

我想獲得每行的某些列的平均值。如何獲得所選列的平均值(平均值)

我有這樣的數據:

w=c(5,6,7,8) 
x=c(1,2,3,4) 
y=c(1,2,3) 
length(y)=4 
z=data.frame(w,x,y) 

將返回:

w x y 
1 5 1 1 
2 6 2 2 
3 7 3 3 
4 8 4 NA 

我想獲得的平均對某些列,不是所有的人。我的問題是,我的數據中有很多NAs。所以,如果我想x和y的平均值,這就是我想拿回:

w x y mean 
1 5 1 1 1 
2 6 2 2 2 
3 7 3 3 3 
4 8 4 NA 4 

我想我可以做類似z$mean=z$x+z$y/2但最後一排爲y是NA所以很明顯,我不希望要計算的數值孔徑,我不應該被二除。我試過cumsum,但是當那行有一個NA時,它返回NAs。我想我正在尋找的東西,將添加選定的列,忽略NA,獲取沒有NAs的選定列的數量併除以該數字。我嘗試了平均和平均,並完全難住。

ETA:還有一種方法可以將權重添加到特定列嗎?

回答

31

下面是一些例子:

> z$mean <- rowMeans(subset(z, select = c(x, y)), na.rm = TRUE) 
> z 
    w x y mean 
1 5 1 1 1 
2 6 2 2 2 
3 7 3 3 3 
4 8 4 NA 4 

加權平均

> z$y <- rev(z$y) 
> z 
    w x y mean 
1 5 1 NA 1 
2 6 2 3 2 
3 7 3 2 3 
4 8 4 1 4 
> 
> weight <- c(1, 2) # x * 1/3 + y * 2/3 
> z$wmean <- apply(subset(z, select = c(x, y)), 1, function(d) weighted.mean(d, weight, na.rm = TRUE)) 
> z 
    w x y mean wmean 
1 5 1 NA 1 1.000000 
2 6 2 3 2 2.666667 
3 7 3 2 3 2.333333 
4 8 4 1 4 2.000000 
+1

謝謝,這也正是我所期待的。我真的需要研究這個神奇的應用命令,它似乎是一切的解決方案。 – thequerist 2012-02-28 22:30:16

17

嘗試使用rowMeans

z$mean=rowMeans(z[,c("x", "y")], na.rm=TRUE) 

    w x y mean 
1 5 1 1 1 
2 6 2 2 2 
3 7 3 3 3 
4 8 4 NA 4 
+0

+1謝謝,我通常使用Extract,不敢相信我沒有想到這一點。給kohske包括解決方案的支票加權也。 – thequerist 2012-02-28 22:33:19

+0

@andrew如何獲得某個特定名稱的列範圍(例如MGW.1,MGW.2,MGW.3 ... MGW.198)的rowMeans,因此所有這些列都具有以MGW開頭的名稱,但數字是不同的,我不確定這些列的確切數量,他們可能在一個案件196和其他198。我想要的是這樣的:'data.frame(ID = DF [,1:4],MGW = rowMeans(DF [,MGW。*]),HEL = rowMeans(DF [,HEL。*]))'It意味着不應該觸摸前4列,而其餘列中的所有列取平均MGW。*和HEL。* – Newbie 2016-07-27 14:42:07

+0

爲此,我建議使用dplyr和tidyr,因爲dplyr允許您根據常用表達。查看[這個問題](https://stackoverflow.com/questions/33401788/dplyr-using-mutate-like-rowmeans)爲例,或[this gist](https://gist.github.com/andrewheiss/) dcd38268c65396e1f18de626e70cae47)爲這個問題的一個工作的例子。 – Andrew 2016-07-28 18:24:04