dplyr:在group_by对象上计算mean(summarize_each)时处理NAs

时间:2015-06-25 20:24:27

标签: r dplyr mean na

我有一个数据框md:

md <- data.frame(x = c(3,5,4,5,3,5), y = c(5,5,5,4,4,1), z = c(1,3,4,3,5,5),
      device1 = c("c","a","a","b","c","c"), device2 = c("B","A","A","A","B","B"))
md[2,3] <- NA
md[4,1] <- NA
md

我想使用dplyr:

计算device1 / device2组合的均值
library(dplyr)
md %>% group_by(device1, device2) %>% summarise_each(funs(mean))

但是,我得到了一些NAs。我希望忽略NA(na.rm = TRUE) - 我试过,但函数不想接受这个参数。 这两行都会导致错误:

md %>% group_by(device1, device2) %>% summarise_each(funs(mean), na.rm = TRUE)
md %>% group_by(device1, device2) %>% summarise_each(funs(mean, na.rm = TRUE))

3 个答案:

答案 0 :(得分:10)

尝试:

 library(dplyr)
 md %>% group_by(device1, device2) %>%
        summarise_each(funs(mean(., na.rm = TRUE)))

答案 1 :(得分:10)

其他答案显示了将mean(., na.rm = TRUE)传递给summarize/_each的语法。

就个人而言,我经常处理这个问题并且非常烦人,我只是定义了以下一组NA感知基本函数(例如在我的.Rprofile中),这样你就可以应用它们了dplyr summarize(mean_),没有讨厌的arg-passing;同时保持源代码更清晰,更易读,这是另一个强大的优势:

mean_   <- function(...) mean(..., na.rm=T)
median_ <- function(...) median(..., na.rm=T)
sum_    <- function(...) sum(..., na.rm=T)
sd_     <- function(v)   sqrt(sum((v-mean(v))^2) / length(v))
cor_    <- function(...) cor(..., use='pairwise.complete.obs')
table_  <- function(...) table(..., useNA='ifany')
mode_   <- function(...) {
  tab <- table(...)
  names(tab[tab==max(tab)]) # the '==' implicitly excludes NA values
}
clamp_  <- function(..., minval=0, maxval=70) pmax(minval, pmin(maxval,...))

你真的希望能够一劳永逸地轻弹一个全局开关,比如na.action/na.pass/na.omit/na.fail告诉函数默认行为该做什么,而不是像现在这样,在不同的情况下抛出错误或不一致包。

曾经有一个名为Defaults的CRAN软件包用于设置每个函数的默认值,但是自2014年以来,它不会在3.x之前维护。有关它的更多信息Setting Function Defaults R on a Project Specific Basis

答案 2 :(得分:7)

简单:

funs(mean(., na.rm = TRUE))