列的平均值,而忽略可变数量的元素

时间:2014-07-17 20:09:47

标签: r

从每列中选择可变数量的元素时,如何获取列方式?

示例:

a<-c(1,2,3,0,0)
b<-c(1,2,3,4,0)
c<-c(1,2,3,4,5)

d<- cbind(a,b,c)

如何忽略每列的平均值而忽略下面的可变数量的元素(上例中的零数)? colMeans将返回(1 + 2 + 3 + 0 + 0)/ 5 = 1.2表示a的平均值,我想得到(1 + 2 + 3)/ 3 = 2.

4 个答案:

答案 0 :(得分:4)

这里有一个解决方案。

>apply(d, 2, function(x) mean(subset(x, !x==0)))

  a   b   c 
2.0 2.5 3.0 

答案 1 :(得分:4)

您还可以通过将apply分配给零

来避免NA次循环
d[d == 0] <- NA
colMeans(d, na.rm = TRUE)
##   a   b   c 
## 2.0 2.5 3.0 

或者,如果您不想用NA替换零,则解决此问题的最快方法是使用data.table包(假设d是您原始的未转换数据)

library(data.table)
as.data.table(d)[, lapply(.SD, function(x) mean(x[x != 0]))]
##    a   b c
## 1: 2 2.5 3

答案 2 :(得分:1)

对于这项特定任务,您也可以使用:

tmp = d != 0
colSums(d * tmp) / colSums(tmp)
  a   b   c 
2.0 2.5 3.0

答案 3 :(得分:0)

一种简单的方法是编写一个函数,首先用NA替换所有0,然后计算均值。例如,

 my.mean <- function(x, num){
            new.x <- ifelse(x==num, NA, x)
            return(mean(new.x, na.rm=T))
 }

然后,

 my.mean(a, 0)

产量

 2

请注意,您可以轻松调整此功能以使其更方便。例如,如果您永远不需要忽略除0以外的任何其他值,则可以将0硬编码到函数中并完全删除第二个参数。

此外,如果要将该函数应用于多个列,则可以使用标准R方法执行此操作。例如,尝试

 apply(d, 2, my.mean, num=0)

返回

   a   b   c 
  2.0 2.5 3.0