我想对数据进行分组,然后排列表格,以便首先显示具有最高值的分组。例如。在mtcars数据集中,我想按汽缸数对汽车进行分组,然后排列表格,以便首先显示均值最高mpg
的组
mtcars %>% group_by (cyl) %>% arrange (desc(mean (mpg)))
这会产生错误:
Error: incorrect size (1) at position 1, expecting : 32
我问的原因是在将group_by()应用到整个组而不是单个行之后应用filter()。
答案 0 :(得分:3)
执行此操作的一个好方法是将分组变量转换为factor
,然后使用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)
像这样更改数据非常好,因为您指定的顺序将被其他功能记住并使用(例如ggplot
中的顺序条或刻面)。
答案 1 :(得分:0)
也许这样?首先,按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