我如何使用 dplyr 中的排列来订购组?

Pav*_*aha 2 r dplyr

我想对数据进行分组,然后排列表格,以便首先显示具有最高值的组。例如,在 mtcars 数据集中,我想按气缸数对汽车进行分组,然后排列表格,以便mpg首先显示平均值最高的组

mtcars %>% group_by (cyl)  %>% arrange (desc(mean (mpg)))
Run Code Online (Sandbox Code Playgroud)

这会产生一个错误:

Error: incorrect size (1) at position 1, expecting : 32
Run Code Online (Sandbox Code Playgroud)

我问的原因是,在 group_by() 之后应用时,filter() 应用于整个组,而不是单个行。

Gre*_*gor 5

一个好方法是将分组变量转换为 afactor并使用reorder(或forcats::fct_reorder) 来控制级别的顺序。然后你就可以arrange通过该栏。(分组隐含在reorder函数中。)

library(dplyr)

mtcars %>%
  mutate(
    cyl = reorder(factor(cyl), -mpg) 
    # stats::reorder, built-in, uses mean by default
    # use -mpg to make it descending
  ) %>%
  arrange(cyl)

# alternately
library(forcats)
mtcars %>%
  mutate(
    cyl = fct_reorder(factor(cyl), mpg, .fun = mean, .desc = TRUE)
    # forcats::fct_reorder, uses median by default,
    # takes a .desc argument to make it descending
  ) %>%
  arrange(cyl)
Run Code Online (Sandbox Code Playgroud)

像这样更改数据很好,因为您指定的顺序将被其他函数记住并使用(例如对 a 中的条形或面进行排序ggplot)。