我正在尝试计算数据框中每一行的平均值。每行都有零,我想从计算中排除这些。我不想删除整行,只删除零并计算每行中剩余值的平均值。如果行的值全为零,则结果应为零。
问问题
17958 次
2 回答
20
怎么样
nzmean <- function(x) {
if (all(x==0)) 0 else mean(x[x!=0])
}
apply(mydata,1,nzmean)
?
在我看来,它可能会稍微快一点
nzmean <- function(x) {
zvals <- x==0
if (all(zvals)) 0 else mean(x[!zvals])
}
即尽量避免x
与零进行两次比较。
于 2012-09-25T13:05:38.310 回答
15
或者您可以做的是分配NA
为零,这实际上是您想要做的。一些样本数据:
spam = matrix(runif(100), 10, 10)
spam[1,2] = 0
spam[4,3] = 0
spam[10,] = 0
spam[spam == 0] <- NA
并使用rowMeans
, ifelse
is 检查完全是NA
. 这个na.rm
论点在这里很重要:
mean_values = rowMeans(spam, na.rm = TRUE)
mean_values = ifelse(is.na(mean_values), 0, mean_values)
于 2012-09-25T13:16:21.217 回答