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)