Подтвердить что ты не робот

Dplyr - упорядочить групповую переменную grouped_df, не работающую

У меня есть 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, он работает.

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

Мне что-то не хватает или мне нужно будет делать это каждый раз при попытке arrange grouped_df сгруппированной переменной?

R Версия: 3.1.1 Версия пакета dplyr: 0.3.0.2

РЕДАКТИРОВАТЬ 11/13/2017: Как отмечено lucacerone, начиная с dplyr 0.5, при сортировке организация снова игнорирует группы. Итак, мой оригинальный код теперь работает так, как я ожидал.

аранжировка() снова игнорирует группировку, возвращаясь к поведению dplyr 0.3 и ранее. Это делает аранжировку() несовместимой с другими глаголами dplyr, но я думаю, что это поведение, как правило, более полезно. Несмотря на это, он не будет меняться снова, поскольку все больше изменений просто вызовут больше путаницы.

4b9b3361

Ответ 1

Попробуйте переключить порядок вашего оператора 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))

Ответ 2

Последние версии dplyr (по крайней мере, от dplyr_0.7.4) позволяют arrange в группах. Вы только что установили в .by_group = TRUE arrange() .by_group = TRUE. Более подробная информация доступна здесь. В вашем примере попробуйте:

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