簡體   English   中英

使用 dplyr 按所有列排列數據框

[英]Arrange data frame by all columns using dplyr

我正在生成 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

reprex 包(v0.1.1.9000) 於2018年 1 月 1 日創建。

我需要按升序排列變量的總和,然后按降序排列每個變量。 使用dplyr::arrange()非常簡單。 但是,我想有一個更強大的安排方法。 例如,如果將num_var更改為,那么最后一行也必須更改為arrange(total, desc(var_1, var_2, var_3, var_4)) 我已經嘗試使用 tidy 選擇器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 包(v0.1.1.9000) 於2018年 1 月 1 日創建。

有沒有辦法選擇變量進行排列而不直接命名它們?

arrange似乎不能直接與選擇幫助函數一起使用。 您可以按升序使用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

可以使用此代碼按從左到右的每一列進行排列

library(magrittr) ; library(rlang) ; library(dplyr)
data %>% arrange(!!!syms(colnames(.)))

這是有效的,因為安排不接受 tidyselect 語法,因此必須為每個名稱傳遞符號(或者也可能是字符串)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM