我尝试将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
内向我的函数传递正确的数据框(尊重组)吗?
答案 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)