Dplyr - 按组变量排列groups_df不起作用

TBT*_*BT8 31 r grouped-table dplyr

我有一个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)
                )
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

我是否遗漏了某些东西,或者每次尝试arrange按分组变量分组_df 时是否需要这样做?

R版本:3.1.1 dplyr软件包版本:0.3.0.2

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

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

Kar*_*Woo 65

尝试切换group_by语句的顺序:

df %>% 
  group_by(year, client) %>%
  summarise(tot = sum(rev)) %>%
  arrange(year, desc(tot))
Run Code Online (Sandbox Code Playgroud)

我认为arrange是在团体内订购; 之后summarize,最后一个组被删除,所以这意味着在你的第一个例子中,它在client组内排列行.切换顺序group_by(year, client)似乎可以修复它,因为该client组在之后被删除summarize.

或者,有ungroup()功能

df %>% 
  group_by(client, year) %>%
  summarise(tot = sum(rev)) %>%
  ungroup() %>%
  arrange(year, desc(tot))
Run Code Online (Sandbox Code Playgroud)

  • 因为dplyr 0.5这不再起作用了:```Breaking changes arrange()再次忽略分组,恢复到dplyr 0.3及更早版本的行为.这使得arrange()与其他dplyr动词不一致,但我认为这种行为通常更有用.无论如何,它不会再发生变化,因为更多的变化只会导致更多的混乱.`` (10认同)
  • 此评论需要更加明显.不幸的是,随着安排的行为改变,然后在这个阶段使很多旧的,高度支持的stackoverflow答案不正确. (2认同)

ngh*_*ran 6

最新版本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)
Run Code Online (Sandbox Code Playgroud)