我有一个数据框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))
答案 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))