2017-05-27 52 views
1

正在尝试使用dplyr与我自己的函数,它将数据帧汇总为单个值。在下面的例子中,my_func计算缺失值的数量。我可以用另一种方式做这个特定的案例,但我有兴趣知道如何做到这一点。我需要这个来处理分组数据。我觉得这样的事情可能工作:传递正确的数据帧从dplyr :: summarize

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

回答

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

+0

非常感谢。我同意它看起来像你提到的相同的错误。我认为这证实了我的观点,即我最初的想法“应该”能够工作,并且在将来可能会解决dplyr问题。 – Danny

0

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

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

您还可以使用:

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

我希望这可以帮助你!

+0

感谢您的回复。在你的第一个建议中,我找不到函数'num.missing'。但无论如何,我正在寻找这样做的一般功能,而不仅仅是计数缺失值的例子。当我做'airquality%>%summarise_each(funs(my_func),Month)'时,你的第二个建议没有给出正确的输出,没有分组。所以我不明白这是如何解决它的。 – Danny

0

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

+0

谢谢,这确实有用。我更感兴趣的是理解为什么在'dplyr'中不起作用,或者'dplyr'的另一种用法可以实现这一点,因为我相信这是应该可以在包中实现的。 – Danny

相关问题