我可以使用dplyr中的arange来订购组吗?
我希望将数据分组,然后排列表格,以便首先显示具有最高值的组。例如,在mtcars数据集中,我想按气缸数对车辆进行分组,然后排列表格,以便首先显示平均值最高的组我可以使用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()
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)