我可以使用dplyr中的arange来订购组吗?

我可以使用dplyr中的arange来订购组吗?,r,dplyr,R,Dplyr,我希望将数据分组,然后排列表格,以便首先显示具有最高值的组。例如,在mtcars数据集中,我想按气缸数对车辆进行分组,然后排列表格,以便首先显示平均值最高的组mpg mtcars %>% group_by (cyl) %>% arrange (desc(mean (mpg))) 这会产生一个错误: Error: incorrect size (1) at position 1, expecting : 32 我问这个问题的原因是,当在group_by()之后应用filter()

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

mtcars %>% group_by (cyl)  %>% arrange (desc(mean (mpg)))
这会产生一个错误:

Error: incorrect size (1) at position 1, expecting : 32

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

也许是这样?首先,按
cyl
分组,然后用
mean(mpg)
填充一个新列,然后您可以根据需要进行排列,最后删除临时
mean(mpg)

mtcars %>% 
  group_by(cyl) %>% 
  mutate(mean_mpg = mean(mpg)) %>%
  arrange(desc(mean_mpg)) %>%
  select(-mean_mpg)

#> # A tibble: 32 x 11
#> # Groups:   cyl [3]
#>      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#>    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#>  1  22.8     4 108      93  3.85  2.32  18.6     1     1     4     1
#>  2  24.4     4 147.     62  3.69  3.19  20       1     0     4     2
#>  3  22.8     4 141.     95  3.92  3.15  22.9     1     0     4     2
#>  4  32.4     4  78.7    66  4.08  2.2   19.5     1     1     4     1
#>  5  30.4     4  75.7    52  4.93  1.62  18.5     1     1     4     2
#>  6  33.9     4  71.1    65  4.22  1.84  19.9     1     1     4     1
#>  7  21.5     4 120.     97  3.7   2.46  20.0     1     0     3     1
#>  8  27.3     4  79      66  4.08  1.94  18.9     1     1     4     1
#>  9  26       4 120.     91  4.43  2.14  16.7     0     1     5     2
#> 10  30.4     4  95.1   113  3.77  1.51  16.9     1     1     5     2
#> # ... with 22 more rows

mtcars%>%
组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别
变异(平均值=平均值(mpg))%>%
排列(描述(平均值))%>%
选择(-mean_mpg)
#>#tibble:32 x 11
#>#组别:共青团[3]
#>mpg气缸显示hp drat wt qsec与am齿轮carb
#>              
#>  1  22.8     4 108      93  3.85  2.32  18.6     1     1     4     1
#>  2  24.4     4 147.     62  3.69  3.19  20       1     0     4     2
#>  3  22.8     4 141.     95  3.92  3.15  22.9     1     0     4     2
#>  4  32.4     4  78.7    66  4.08  2.2   19.5     1     1     4     1
#>  5  30.4     4  75.7    52  4.93  1.62  18.5     1     1     4     2
#>  6  33.9     4  71.1    65  4.22  1.84  19.9     1     1     4     1
#>  7  21.5     4 120.     97  3.7   2.46  20.0     1     0     3     1
#>  8  27.3     4  79      66  4.08  1.94  18.9     1     1     4     1
#>  9  26       4 120.     91  4.43  2.14  16.7     0     1     5     2
#> 10  30.4     4  95.1   113  3.77  1.51  16.9     1     1     5     2
#> # ... 还有22排

一个很好的方法是将分组变量转换为
因子
,并使用
重新排序
(或
forcats::fct_reorder
)来控制级别的顺序。然后您可以按该列
排列
。(分组隐含在
重新排序
函数中。)


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

@AllanCameron OP希望通过平均值
mpg
为每个
cyl
分组排序,而不是
cyl
。是的,这是我的想法,但不幸的是,这意味着filter和arrange具有不一致的behvior:filter在组级别上运行,arrange不运行。我认为更好的说法是
arrange
不允许使用摘要函数。他们都在小组内工作。
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)