如何在从数据框中的行中排除零值的同时计算行的平均值

Gon*_*gon 12 r

我试图计算数据框中每一行的平均值.每行都有零,我想从计算中排除这些.我不想删除整行而只删除零并计算每行中剩余值的平均值.如果行的全部值为零,则结果应为零.

Ben*_*ker 20

怎么样

nzmean <- function(x) {
    if (all(x==0)) 0 else mean(x[x!=0])
}
apply(mydata,1,nzmean)
Run Code Online (Sandbox Code Playgroud)

我觉得它可能会稍微快一点

nzmean <- function(x) {
    zvals <- x==0
    if (all(zvals)) 0 else mean(x[!zvals])
}
Run Code Online (Sandbox Code Playgroud)

即尽量避免x与零进行两次比较.


Pau*_*tra 15

或者你可以做的是分配NA零,这实际上是你想要做的.一些样本数据:

spam = matrix(runif(100), 10, 10)
spam[1,2] = 0
spam[4,3] = 0
spam[10,] = 0
spam[spam == 0] <- NA
Run Code Online (Sandbox Code Playgroud)

并使用rowMeans,ifelse是检查完全的行NA.这个na.rm论点很重要:

mean_values = rowMeans(spam, na.rm = TRUE)
mean_values = ifelse(is.na(mean_values), 0, mean_values)
Run Code Online (Sandbox Code Playgroud)

  • 这可能(?)比我对非常大的数据集的解决方案更快. (4认同)
  • 我也喜欢在概念上使用NA,它清楚地表明0不是有效数字. (2认同)