按组变量排列groups_df不起作用

时间:2014-10-24 19:54:48

标签: r dplyr grouped-table

我有一个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分组_df时是否需要执行此操作?

R版本:3.1.1 dplyr包版本:0.3.0.2

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

  

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

2 个答案:

答案 0 :(得分:65)

尝试切换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这不再适用了:

  

中断更改arrange()再次忽略分组,还原   对dplyr 0.3及更早版本的行为。这使得arrange()   与其他dplyr动词不一致,但我认为这种行为是   通常更有用。无论如何,它不会再像以前一样改变   更多的变化只会引起更多的混乱。

答案 1 :(得分:6)

dplyr的最新版本(至少来自dplyr_0.7.4)允许组内的arrange。您只需将其设置为arrange()调用.by_group = TRUE。有更多信息可用here 在您的示例中,尝试:

library(dplyr)
df %>% 
        group_by(client, year) %>%
        summarise(tot = sum(rev)) %>%
        arrange(desc(tot), .by_group = TRUE)