我有一个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动词不一致,但我认为这种行为通常更有用。无论如何,它不会再发生变化,因为更多的变化只会引起更多的混乱。
答案 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)