R, dplyr - комбинация group_by() и arr() не дает ожидаемого результата?
при использовании функции dplyr group_by()
и сразу после arrange()
я ожидаю получить вывод, где кадр данных упорядочен в группах, которые я указал в group_by()
. Мое чтение документации заключается в том, что эта комбинация должна приводить к такому результату, однако, когда я это пробовал, это не то, что я получаю, а googling не указывает на то, что другие люди столкнулись с одной проблемой. Неужели я ошибаюсь в ожидании этого результата?
Вот пример, используя встроенный набор данных R ToothGrowth:
library(dplyr)
ToothGrowth %>%
group_by(supp) %>%
arrange(len)
Запуск этого приведет к созданию кадра данных, где весь кадр данных упорядочен в соответствии с len
, а не внутри supp
факторов.
Это код, который производит желаемый вывод:
ToothGrowth %>%
group_by(supp) %>%
do( data.frame(with(data=., .[order(len),] )) )
Ответы
Ответ 1
Я думаю, что вы хотите
ToothGrowth %>%
arrange(supp,len)
Цепочная система просто заменяет вложенные команды, поэтому сначала вы группируете, а затем упорядочиваете этот сгруппированный результат, который нарушает первоначальный порядок.
Ответ 2
Еще один способ исправить эту непредвиденную проблему при использовании оператора group_by()
- преобразовать grouped_df
обратно в data frame
.
group_by требуется для резюме, например:
ToothGrowthMeanLen <- ToothGrowth %>%
group_by(supp, dose) %>%
summarise(meanlen = mean(len))
Эта сводная таблица не упорядочена в порядке среднего значения
ToothGrowthMeanLen %>%
arrange(meanlen)
Эта сводная таблица расположена в порядке среднего значения
ToothGrowthMeanLen %>%
data.frame() %>% # Convert to a simple data frame
arrange(meanlen)
Преобразование grouped_df
назад в кадр данных - это первый способ, которым я нашел сортировку обобщенного data.frame. Но на самом деле dplyr::ungroup
существует для этой цели.
ToothGrowthMeanLen %>%
ungroup() %>% # Remove grouping
arrange(meanlen)