从每列中选择可变数量的元素时,如何获取列方式?
示例:
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.
答案 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