cheatsheet - Dplyr-Organiza un grouped_df por variable de grupo que no funciona
sum by group in r (2)
Tengo un data.frame que contiene los nombres de los clientes, los años y varios números de ingresos de cada año.
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)
)
Quiero terminar con un data.frame que agrega los ingresos por cliente y año. Luego quiero ordenar el data.frame por año y luego por ingresos descendentes.
library(dplyr)
df1 <- df %>%
group_by(client, year) %>%
summarise(tot = sum(rev)) %>%
arrange(year, desc(tot))
Sin embargo, cuando se usa el código sobre la función de arrange()
, no cambia el orden del data.frame agrupado. Cuando ejecuto el siguiente código y coacciono a un data.frame normal, funciona.
library(dplyr)
df1 <- df %>%
group_by(client, year) %>%
summarise(tot = sum(rev)) %>%
data.frame() %>%
arrange(year, desc(tot))
¿Me estoy perdiendo algo o tendré que hacer esto cada vez que intente arrange
un grouped_df por una variable agrupada?
Versión R: 3.1.1 versión del paquete dplyr: 0.3.0.2
EDITAR 11/13/2017: como lo señala lucacerone , comenzando con dplyr 0.5, la organización una vez más ignora los grupos al ordenar. Así que mi código original ahora funciona de la manera que inicialmente esperaba.
Arreglar () una vez más ignora la agrupación, volviendo al comportamiento de dplyr 0.3 y anteriores. Esto hace que la orden () sea inconsistente con otros verbos dplyr, pero creo que este comportamiento es generalmente más útil. En cualquier caso, no volverá a cambiar, ya que más cambios solo causarán más confusión.
Intente cambiar el orden de su instrucción group_by
:
df %>%
group_by(year, client) %>%
summarise(tot = sum(rev)) %>%
arrange(year, desc(tot))
Creo que arrange
es ordenar dentro de grupos; después de summarize
, el último grupo se elimina, por lo que esto significa que en su primer ejemplo está organizando filas dentro del grupo de client
. Cambiar el orden a group_by(year, client)
parece arreglarlo porque el grupo de client
se cae después de summarize
.
Alternativamente, existe la función ungroup()
df %>%
group_by(client, year) %>%
summarise(tot = sum(rev)) %>%
ungroup() %>%
arrange(year, desc(tot))
Las últimas versiones de dplyr
(al menos desde dplyr_0.7.4
) permiten organizar dentro de los grupos. Solo tiene que especificar en la llamada de arrange()
.by_group = TRUE
. Más información está disponible aquí. En tu ejemplo, prueba:
library(dplyr) df %>% group_by(client, year) %>% summarise(tot = sum(rev)) %>% arrange(desc(tot), .by_group = TRUE)