使用 dplyr 按所有列排列数据框

Jak*_*son 4 r dplyr tidyverse tidyselect

我生成 1 和 0 的数据帧如下:

library(tidyverse)
library(glue)

num_var <- 3

rep(list(c(0L, 1L)), num_var) %>%
  set_names(glue("var_{seq_len(num_var)}")) %>%
  expand.grid() %>%
  mutate(total = rowSums(.)) %>%
  select(total, everything()) %>%
  arrange(total, desc(var_1, var_2, var_3))

#>   total var_1 var_2 var_3
#> 1     0     0     0     0
#> 2     1     1     0     0
#> 3     1     0     1     0
#> 4     1     0     0     1
#> 5     2     1     1     0
#> 6     2     1     0     1
#> 7     2     0     1     1
#> 8     3     1     1     1
Run Code Online (Sandbox Code Playgroud)

reprex 包(v0.1.1.9000) 于 2018-01-08 创建。

我需要按变量的总和按升序排列,然后按降序排列每个变量。使用起来相当简单dplyr::arrange()。但是,我想要一种更稳健的安排方法。例如,如果num_var更改为,那么,最后一行也必须更改为arrange(total, desc(var_1, var_2, var_3, var_4))。我尝试使用整洁的选择器everything()来排列,就像我对select()函数所做的那样,但是出现错误:

library(tidyverse)
library(glue)

num_var <- 3

rep(list(c(0L, 1L)), num_var) %>%
  set_names(glue("var_{seq_len(num_var)}")) %>%
  expand.grid() %>%
  mutate(total = rowSums(.)) %>%
  select(total, everything()) %>%
  arrange(total, desc(everything()))

#> Error in arrange_impl(.data, dots): Evaluation error: No tidyselect variables were registered.
Run Code Online (Sandbox Code Playgroud)

reprex 包(v0.1.1.9000) 于 2018-01-08 创建。

有没有一种方法可以选择变量进行排列而不直接命名它们?

Mat*_*fou 6

对于较新版本的dplyr,您现在可以使用across

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

iris %>% 
  arrange(across(everything(), desc)) %>% 
  head()
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
#> 1          7.9         3.8          6.4         2.0 virginica
#> 2          7.7         3.8          6.7         2.2 virginica
#> 3          7.7         3.0          6.1         2.3 virginica
#> 4          7.7         2.8          6.7         2.0 virginica
#> 5          7.7         2.6          6.9         2.3 virginica
#> 6          7.6         3.0          6.6         2.1 virginica


all.equal(iris %>% 
            arrange(across(everything(), desc)) ,
          iris %>% 
            arrange(desc(Sepal.Length), desc(Sepal.Width), desc(Petal.Length), desc(Petal.Width), desc(Species)))
#> [1] TRUE
Run Code Online (Sandbox Code Playgroud)

由reprex 包(v2.0.1)于 2022-02-07 创建