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, но я думаю, что это поведение, как правило, более полезно. Несмотря на это, он не будет меняться снова, поскольку все больше изменений просто вызовут больше путаницы.
Ответы
Ответ 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)