dplyr 0.5: arrange() 使用分组

dplyr 0.5: arrange() using groupings

我有很多用 dplyr 0.4.3 编写的代码,它们依赖于分组的 arrange() 函数。从 0.5 版本开始,arrange 不再应用分组。

这个决定让我感到困惑,因为这使得 arrange() 与其他 dplyr 动词不一致,而且如果需要取消分组,用户肯定可以在 arrange() 之前取消分组()。我本来希望 arrange() 中的一个参数可以保留 grouped_by 行为,但是唉!

因此我不得不重写我的分组安排。此时,我唯一的选择似乎是在 arrange 调用时打断管道,循环遍历组并逐组排列,然后再次 bind() 结果。我希望有更优雅的解决方案?

下面是一个 MRE,我想 运行 每个 group_by(cyl) 上的 cumsum。非常感谢 ideas/suggestions。

library(dplyr)

mtcars %>% 
  group_by(cyl) %>% 
  arrange(desc(mpg)) %>%
  mutate(WtCum = cumsum(wt))

要在 dplyr 0.5 中的组内排序,请在 arrange.

中的其他排序变量之前添加分组变量
mtcars %>% 
       group_by(cyl) %>% 
       arrange(cyl, desc(mpg))

如果你想保留一个“旧arrange”,你可以使用this snippet:

arrange_old <- function(.data, ...) {
  dplyr::arrange_(.data, .dots = c(groups(.data), lazyeval::lazy_dots(...)))
}

这将通过基本上将组变量添加到新的 arrange 调用来尊重分组。

那么你可以这样做:

mtcars %>% 
    group_by(cyl) %>% 
    arrange_old(desc(mpg))

尽管如此,我也发现此更改令人困惑且不直观,而且我一直犯错误,忘记明确指定分组。