2012-02-28 138 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