32

我有一个 data.frame,其中包含客户姓名、年份和每年的几个收入数字。

df <- data.frame(client = rep(c("Client A","Client B", "Client C"),3), 
                 year = rep(c(2014,2013,2012), each=3), 
                 rev = rep(c(10,20,30),3)
                )

我想最终得到一个按客户和年份汇总收入的 data.frame。然后我想按年对 data.frame 进行排序,然后按收入递减。

library(dplyr)
df1 <- df %>% 
        group_by(client, year) %>%
        summarise(tot = sum(rev)) %>%
        arrange(year, desc(tot))

但是,当使用上面的代码时,该arrange()函数根本不会改变分组 data.frame 的顺序。当我运行以下代码并强制转换为正常的 data.frame 时,它​​可以工作。

   library(dplyr)
    df1 <- df %>% 
            group_by(client, year) %>%
            summarise(tot = sum(rev)) %>%
            data.frame() %>%
            arrange(year, desc(tot))

每次尝试arrange通过分组变量进行 grouped_df 时,我是否遗漏了什么或者我需要这样做?

R 版本:3.1.1 dplyr 包版本:0.3.0.2

编辑 2017 年 11 月 13 日:lucacerone 所述,从 dplyr 0.5 开始,排列时再次忽略组。所以我的原始代码现在可以按照我最初预期的方式工作。

安排()再次忽略分组,恢复到 dplyr 0.3 及更早版本的行为。这使得arrange() 与其他dplyr 动词不一致,但我认为这种行为通常更有用。无论如何,它不会再次改变,因为更多的改变只​​会导致更多的混乱。

4

2 回答 2

68

尝试切换group_by语句的顺序:

df %>% 
  group_by(year, client) %>%
  summarise(tot = sum(rev)) %>%
  arrange(year, desc(tot))

我认为arrange是在组内订购;之后summarize,最后一个组被删除,因此这意味着在您的第一个示例中,它在组内排列行client。将顺序切换为group_by(year, client)似乎可以解决它,因为该client组在 之后被丢弃summarize

或者,有ungroup()功能

df %>% 
  group_by(client, year) %>%
  summarise(tot = sum(rev)) %>%
  ungroup() %>%
  arrange(year, desc(tot))

编辑,@lucacerone:因为 dplyr 0.5 这不再起作用:

破坏性更改安排()再次忽略分组,恢复到 dplyr 0.3 及更早版本的行为。这使得arrange() 与其他dplyr 动词不一致,但我认为这种行为通常更有用。无论如何,它不会再次改变,因为更多的改变只​​会导致更多的混乱。

于 2014-10-24T20:04:16.890 回答
7

dplyr(至少来自)的最新版本dplyr_0.7.4允许arrange在组内。你只是这么设置的arrange()电话.by_group = TRUE此处提供了更多信息 在您的示例中,请尝试:

library(dplyr)
df %>% 
        group_by(client, year) %>%
        summarise(tot = sum(rev)) %>%
        arrange(desc(tot), .by_group = TRUE)
于 2018-09-28T16:28:17.340 回答