【问题标题】:Mean excluding zero and na for all columns with dplyr对于所有具有 dplyr 的列,均值不包括零和 na
【发布时间】:2016-03-09 17:00:12
【问题描述】:

我想为我的所有列使用 dplyr 包对我的数据框进行平均处理。

n = c(NA, 3, 5) 
s = c("aa", "bb", "cc") 
b = c(3, 0, 5) 
df = data.frame(n, s, b)

在这里,我希望我的函数在 n 和 b 列中得到 mean = 4 我试过mean(df$n[df$n>0]) 但对于大型数据框来说并不容易。 我想要df %>% summarise_each(funs(mean))之类的东西... 谢谢

【问题讨论】:

  • 只用my_mean <- function(x) mean(x[x != 0],na.rm = TRUE)?您希望s 列发生什么?
  • 大概可以df %>% summarise_each(funs(mean(.[!is.na(.) & . != 0])), -s)。或df %>% summarise_each(funs(mean(.[. != 0], na.rm = TRUE)), -s) 类似于 jorans 的建议。
  • 感谢大卫完美! “-s”是什么意思?
  • 表示不包含s列,因为它是非数字的
  • 感谢您的快速答复!

标签: r dplyr


【解决方案1】:

如果您不想要 0,可能是因为您将它们视为 NA,所以让我们明确一点,然后用 na.rm = TRUE 总结数字列:

library(dplyr)
df[df==0] <- NA
summarize_if(df, is.numeric, mean, na.rm = TRUE)
#   n b
# 1 4 4

作为一个班轮:

summarize_if(`[<-`(df, df==0, value= NA), is.numeric, mean, na.rm = TRUE)

R为基数(结果为命名的数字向量)

sapply(`[<-`(df, df==0, value= NA)[sapply(df, is.numeric)], mean, na.rm=TRUE)

【讨论】:

    【解决方案2】:

    参见优雅的大卫答案:

    df %>% summarise_each(funs(mean(.[!is.na(.) & . != 0])), -s) 
    

    或者

    df %>% summarise_each(funs(mean(.[. != 0], na.rm = TRUE)), -s)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      • 2022-01-08
      • 2022-01-16
      • 2019-11-05
      • 2011-06-12
      相关资源
      最近更新 更多