从dplyr :: summarize中传递正确的数据框

时间:2017-05-27 13:09:11

标签: r dplyr

我尝试将dplyr与我自己的函数一起使用,该函数将数据框汇总为单个值。在下面的示例中,my_func计算缺失值的数量。我可以用另一种方式做这个具体案例,但我有兴趣知道如何做到这一点。我需要这个来处理分组数据。我觉得这样的事情可能有用:

my_func <- function(df) {
  return(sum(is.na(df)))
}

data("airquality")

airquality %>% group_by(Month) %>% summarise(my_func(.))

## # A tibble: 5 × 2
##   Month `my_func(.)`
##   <int>        <int>
## 1     5           44
## 2     6           44
## 3     7           44
## 4     8           44
## 5     9           44

但似乎.是整个数据框,而不是单个组。

dplyr::do可以获得正确的数据框:

airquality %>% group_by(Month) %>% do(data.frame(m = my_func(.)))

## Source: local data frame [5 x 2]
## Groups: Month [5]
## 
##   Month     m
##   <int> <int>
## 1     5     9
## 2     6    21
## 3     7     5
## 4     8     8
## 5     9     1

但这似乎是一个黑客。它也与summarise不一致,因为do的输出仍然是分组数据框。

基本上,我的问题是:我可以从summarise内向我的函数传递正确的数据框(尊重组)吗?

3 个答案:

答案 0 :(得分:1)

经过一些进一步检查后,似乎问题在于.中使用summarise。例如,以下适用于单个变量:

airquality %>% group_by(Month) %>% summarize(my_func(Ozone))

然而这个人没有:

airquality %>% group_by(Month) %>% summarize(my_func(.$Ozone))

同样,显式创建包含所有变量的data.frame可得到所需的输出:

airquality %>% group_by(Month) %>% summarize(NAs = my_func(data.frame(Ozone, Solar.R, Wind, Temp, Month, Day)))

因此,如果您坚持使用dplyr,则需要像这样的解决方法(或者如您所述使用do)。我相信它与此处报告的错误相同:dplyr Issue #2752

答案 1 :(得分:0)

所以,我认为你可以使用以下结构:

data <- num.missing(lapply(data$Month, my_func))

您也可以使用:

object <- data %>% summarise_each(funs(my_func), Month)

我希望这可以帮到你!

答案 2 :(得分:0)

如果您不介意使用plyr包,那么这似乎会产生所需的输出: plyr::ddply(.data = airquality, .variables = ~ Month, .fun = my_func)