R,dplyr - group_by()和arrange()的组合不会产生预期的结果?

时间:2014-07-09 09:16:16

标签: r dplyr

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

以下是一个示例,使用R内置数据集ToothGrowth:

group_by()

运行此操作将生成一个数据框,其中整个数据框按library(dplyr) ToothGrowth %>% group_by(supp) %>% arrange(len) 排序,而不是len因子。

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

supp

3 个答案:

答案 0 :(得分:25)

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

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

答案 1 :(得分:10)

我想你想要

ToothGrowth %>%
  arrange(supp,len)

链接系统只是替换了嵌套命令,因此首先进行分组,然后对分组结果进行排序,从而打破原始排序。

答案 2 :(得分:2)

在使用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)