首页 文章

dplyr 0.5:使用分组排列()

提问于
浏览
2

我有很多用dplyr 0.4.3编写的代码,它依赖于分组的arrange()函数 . 截至0.5版本,安排不再适用分组 .

这个决定让我感到困惑,因为这使得arrange()与其他dplyr动词不一致,如果需要ungrouped,用户可以在arrange()之前取消组合() . 我希望也许在arrange()中有一个参数来保留groups_by行为,但是唉!

因此,我必须重写我的分组安排 . 此时,我唯一的选择似乎是在排列调用中拆分管道,循环遍历组并按组排列,然后再次绑定()结果 . 我希望有更优雅的解决方案吗?

下面是一个MRE,我想在wt per group_by(cyl)上运行一个cumsum . 非常感谢您的想法/建议 .

library(dplyr)

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

2 回答

  • 6

    要在dplyr 0.5中的组内进行排序,请在 arrange 中的其他排序变量之前添加分组变量 .

    mtcars %>% 
           group_by(cyl) %>% 
           arrange(cyl, desc(mpg))
    
  • 1

    如果你想保留一个“旧 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))
    

    对于它的 Value ,我也发现这种变化令人困惑和不直观,我一直犯错误,忘记明确指定分组 .

相关问题