我正在生成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)。
有没有办法选择变量进行排列而不直接命名它们?
arrange
似乎不能直接使用select helper函数。您可以按升序使用arrange_at
,total
,以及除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