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
(至少来自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)