web-dev-qa-db-fra.com

Organiser un grouped_df par variable de groupe ne fonctionnant pas

J'ai un data.frame qui contient les noms des clients, les années et plusieurs chiffres de revenus de chaque année.

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)
                )

Je veux me retrouver avec un data.frame qui agrège les revenus par client et par année. Je souhaite ensuite trier le data.frame par année puis par revenus décroissants.

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

Cependant, lorsque vous utilisez le code ci-dessus, la fonction arrange() ne change pas du tout l'ordre du data.frame groupé. Lorsque j'exécute le code ci-dessous et le contrains à un data.frame normal, cela fonctionne.

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

Suis-je en train de manquer quelque chose ou dois-je le faire à chaque fois lorsque j'essaie de arrange un grouped_df par une variable groupée?

Version R: 3.1.1 Version du package dplyr: 0.3.0.2

EDIT 13/11/2017: Comme indiqué par lucacerone , en commençant par dplyr 0.5, organiser à nouveau ignore les groupes lors du tri. Donc, mon code d'origine fonctionne maintenant de la façon dont je m'attendais au départ.

arrange () ignore à nouveau le regroupement, revenant au comportement de dplyr 0.3 et versions antérieures. Cela rend arrangement () incompatible avec les autres verbes dplyr, mais je pense que ce comportement est généralement plus utile. Quoi qu'il en soit, cela ne changera pas à nouveau, car plus de changements entraîneront juste plus de confusion.

31
TBT8

Essayez de changer l'ordre de votre instruction group_by:

df %>% 
  group_by(year, client) %>%
  summarise(tot = sum(rev)) %>%
  arrange(year, desc(tot))

Je pense que arrange commande au sein des groupes; après summarize, le dernier groupe est supprimé, ce qui signifie que dans votre premier exemple, il organise les lignes dans le groupe client. Le passage de l'ordre à group_by(year, client) semble le corriger car le groupe client est supprimé après summarize.

Alternativement, il y a la fonction ungroup()

df %>% 
  group_by(client, year) %>%
  summarise(tot = sum(rev)) %>%
  ungroup() %>%
  arrange(year, desc(tot))

Edit, @lucacerone: depuis dplyr 0.5 cela ne fonctionne plus:

La rupture des changements arrange () ignore une fois de plus le regroupement, revenant au comportement de dplyr 0.3 et versions antérieures. Cela rend arrangement () incompatible avec les autres verbes dplyr, mais je pense que ce comportement est généralement plus utile. Quoi qu'il en soit, cela ne changera pas à nouveau, car plus de changements entraîneront juste plus de confusion.

65
Kara Woo

Les dernières versions de dplyr (au moins à partir de dplyr_0.7.4) Permettent de arrange au sein des groupes. Vous venez de le faire dans la arrange() appelez .by_group = TRUE. Plus d'informations sont disponibles ici Dans votre exemple, essayez:

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