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))
尽管如此,我也发现此更改令人困惑且不直观,而且我一直犯错误,忘记明确指定分组。
我有很多用 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))
尽管如此,我也发现此更改令人困惑且不直观,而且我一直犯错误,忘记明确指定分组。