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

问题描述 投票:0回答:1

我正在生成1s和0s的数据帧,如下所示:

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

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

我需要按升序排列变量的总和,然后按降序排列每个变量。使用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.

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

有没有办法选择变量进行排列而不直接命名它们?

r dplyr tidyverse tidyselect
1个回答
1
投票

arrange似乎不能直接使用select helper函数。您可以按升序使用arrange_attotal,以及除total之外的其他变量(使用-one_of("total")选择)按降序排列:

arrange_at(vars(total, desc(-one_of("total"))))

#  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
© www.soinside.com 2019 - 2024. All rights reserved.