【问题标题】:R, dplyr - combination of group_by() and arrange() does not produce expected result?R,dplyr - group_by() 和arrange() 的组合不会产生预期的结果?
【发布时间】:2014-08-30 05:53:51
【问题描述】:

当使用 dplyr 函数 group_by() 和紧随其后的 arrange() 时,我希望得到一个输出,其中数据帧按我在 group_by() 中所述的组中排序。我对文档的阅读是这种组合应该产生这样的结果,但是当我尝试它时,这不是我得到的,并且谷歌搜索并没有表明其他人遇到了同样的问题。我期待这个结果有错吗?

这里是一个例子,使用 R 内置数据集 ToothGrowth:

library(dplyr)
ToothGrowth %>%
  group_by(supp) %>%
  arrange(len)

运行此程序将生成一个数据框,其中整个数据框根据len 排序,而不是在supp 因素内。

这是产生所需输出的代码:

ToothGrowth %>%
  group_by(supp) %>%
  do( data.frame(with(data=., .[order(len),] )) )

【问题讨论】:

  • 你能提交一份错误报告吗?
  • 你能链接到这个错误报告吗?
  • @Paul4forest issue 已关闭,因此它要么已经在当前版本中,要么仍在开发分支中。
  • @Hrvoje 感谢您的链接。根据 Hadley 的测试用例,arrange() 首先按group_by() 函数中的列排序,然后按arrange() 函数中的列排序。 test_that("分组排列首先按组排序", { df1 % group_by(cyl) %>%arrange(disp) %>% ungroup() df2 %arrange(cyl, disp) expect_equal (df1, df2) })
  • @PaulRougieux,我不完全理解您的回复。 mtcars %>% group_by(cyl) %>% arrange(disp) %>% ungroup() 产生与mtcars %>% group_by(cyl) %>% arrange(disp) 相同的不良结果它与arrange(cyl,disp) 不同

标签: r dplyr


【解决方案1】:

您可以通过在arrange 中设置.by_group = TRUE 来产生预期的行为:

library(dplyr)
ToothGrowth %>%
    group_by(supp) %>%
    arrange(len, .by_group = TRUE)

【讨论】:

  • FWIW 这是我在给定问题的情况下寻找的答案。
  • 这对我也有帮助!
  • 这应该是公认的答案。 This问题特别需要这样的答案。
【解决方案2】:

我想你想要

ToothGrowth %>%
  arrange(supp,len)

链接系统只是替换了嵌套命令,所以首先你是分组,然后对分组结果进行排序,这会破坏原始排序。

【讨论】:

  • 感谢您的建议。虽然它解决了我的特定问题,但我认为它不适用于更一般的情况,您可能希望保留原始 supp 变量的顺序。
  • 然后使 supp 成为一个因素并使用级别指定排序
  • 我就是想这样做,为什么不能按照你认为应该的方式工作(即先分组,然后安排)
  • 我更喜欢这种方式,因为它更明确地遵循指示。在您要求它对变量进行排序之前,它会是不服从的,直到您添加一个 ungroup() 可以消除所有阻碍安排按要求工作的障碍。
【解决方案3】:

在仍使用group_by() 语句的同时解决此意外订单问题的另一种方法是将grouped_df 转换回data frame。 例如,摘要需要 group_by:

ToothGrowthMeanLen <-  ToothGrowth %>%
    group_by(supp, dose) %>%
    summarise(meanlen = mean(len)) 

这个汇总表没有按meanlen的顺序排列

ToothGrowthMeanLen %>%
    arrange(meanlen)

这个汇总表是按照meanlen的顺序排列的

ToothGrowthMeanLen %>%
    data.frame() %>%   # Convert to a simple data frame
    arrange(meanlen)

grouped_df 转换回数据框是我发现对汇总的data.frame 进行排序的第一种方法。但事实上dplyr::ungroup 就是为此而存在的。

ToothGrowthMeanLen %>%
    ungroup() %>%   # Remove grouping
    arrange(meanlen)

【讨论】:

  • @antoine-sac 实际上你可以使用更好的 ungroup()。
猜你喜欢
  • 1970-01-01
  • 2018-02-21
  • 2018-05-20
  • 1970-01-01
  • 2015-12-03
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多