Dplyr - Uporządkuj zgrupowane df według zmiennej grupy nie działającej

Mam dane.ramka zawierająca nazwy klientów, lata i kilka numerów przychodów z każdego roku.

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)
                )
Chcę skończyć z danymi.ramka, która agreguje przychody według klienta i roku. Następnie chcę posortować dane./ align = "left" /
library(dplyr)
df1 <- df %>% 
        group_by(client, year) %>%
        summarise(tot = sum(rev)) %>%
        arrange(year, desc(tot))

Jednak przy użyciu kodu powyżej Funkcja arrange() nie zmienia kolejności grupowanych danych.w ogóle. Kiedy uruchamiam poniższy kod i wymuszam normalne dane.frame it działa.

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

Czy coś mi umyka, czy będę musiał to robić za każdym razem, gdy próbuję arrange grouped_df przez zmienną zgrupowaną?

R Wersja: 3.1.1 wersja pakietu dplyr: 0.3.0.2

EDIT 11/13/2017: Jak zauważył lucaceron, zaczynając od dplyr 0.5, array ponownie ignoruje grupy podczas sortowania. Więc mój oryginalny kod teraz działa w sposób, w jaki początkowo oczekiwałem, że będzie.

Arrange () po raz kolejny ignoruje grupowanie, cofając do zachowania dplyr 0,3 i wcześniejszych. To sprawia, że arrange() jest niespójne z innymi czasownikami dplyr, ale myślę, że takie zachowanie jest na ogół bardziej użyteczne. Niezależnie od tego, nie zmieni się ponownie, ponieważ więcej zmian spowoduje tylko więcej zamieszania.

Author: TBT8, 2014-10-24

2 answers

Spróbuj zmienić kolejność wypowiedzi group_by:

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

Myślę, że {[3] } porządkuje w grupach; po summarize ostatnia grupa jest opuszczana, więc oznacza to, że w Twoim pierwszym przykładzie układa wiersze w grupie client. Zmiana kolejności na group_by(year, client) wydaje się ją naprawiać, ponieważ grupa client zostaje porzucona po summarize.

Alternatywnie istnieje funkcja ungroup()

df %>% 
  group_by(client, year) %>%
  summarise(tot = sum(rev)) %>%
  ungroup() %>%
  arrange(year, desc(tot))
 65
Author: Kara Woo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-24 20:04:16

Najnowsze wersje dplyr (co najmniej od dplyr_0.7.4) pozwalają na porządkowanie w grupach. Wystarczy, że podasz w arrange() wywołanie .by_group = TRUE. Więcej informacji można znaleźć tutaj W twoim przykładzie spróbuj:

library(dplyr)
df %>% 
        group_by(client, year) %>%
        summarise(tot = sum(rev)) %>%
        arrange(desc(tot), .by_group = TRUE)
 1
Author: ANG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-28 16:28:17