dplyr:在R中按字母顺序排列列

zlhcx6iw  于 2023-02-01  发布在  其他
关注(0)|答案(8)|浏览(170)

如果有一个较大的DF(成百上千个)列,其中不同的col_name按字母顺序随机分布:

df.x <- data.frame(2:11, 1:10, rnorm(10))
colnames(df.x) <- c("ID", "string", "delta")

如何按col_name的字母顺序对所有数据进行排序(垂直)?
实际上,我有数百个CSV(sep=”|“)文本文件,我需要将它们的列读入一个df,按字母顺序排列这些列,然后使用其他一些dplyf函数来获得最终结果。除了如何按字母顺序排列列之外,我已经解决了所有这些问题。我不想对列进行排序(上下)字母表,更确切地说,col_names及其对应数据的实际垂直方向。类似于在Excel中剪切和粘贴整列数据。
例如,我回顾了这种方法,但这是按字母顺序对行进行“排序”,这不是我想要做的。
How to sort a dataframe by column(s)?
谢谢!

ctzwtxfj

ctzwtxfj1#

试试这个

df %>% select(noquote(order(colnames(df))))

或者只是

df[,order(colnames(df))]

2021年12月更新

新版本的dplyr(〉= 1.0.7)可以在没有noquote的情况下工作:

df %>% select(order(colnames(df)))
qnakjoqk

qnakjoqk2#

在dplyr中执行此操作的另一种方法是:

iris %>% 
  select(sort(current_vars()))

current_vars()返回可排序的列名,select()将取列名向量。

0s0u357o

0s0u357o3#

如果特定列必须是第一列(或最后一列),但其余列已排序,则可以:

mtcars %>% tibble %>% 
  select("hp", sort(colnames(.)))
euoag5mw

euoag5mw4#

要使用最近的tidyverse(更具体地说,是tidyselect包)进行部分排序,请使用peek_vars()

library(dplyr)

starwars
#> # A tibble: 87 x 14
#>    name               height  mass hair_color    skin_color  eye_color birth_year
#>    <chr>               <int> <dbl> <chr>         <chr>       <chr>          <dbl>
#>  1 Luke Skywalker        172    77 blond         fair        blue            19.0
#>  2 C-3PO                 167    75 NA            gold        yellow         112.0
#>  3 R2-D2                  96    32 NA            white, blue red             33.0
#>  4 Darth Vader           202   136 none          white       yellow          41.9
#>  5 Leia Organa           150    49 brown         light       brown           19.0
#>  6 Owen Lars             178   120 brown, grey   light       blue            52.0
#>  7 Beru Whitesun lars    165    75 brown         light       blue            47.0
#>  8 R5-D4                  97    32 NA            white, red  red               NA
#>  9 Biggs Darklighter     183    84 black         light       brown           24.0
#> 10 Obi-Wan Kenobi        182    77 auburn, white fair        blue-gray       57.0
#> # ... with 77 more rows, and 7 more variables: sex <chr>, gender <chr>,
#> #   homeworld <chr>, species <chr>, films <list>, vehicles <list>, starships <list>

starwars %>% select(name, mass, sort(tidyselect::peek_vars()))
#> # A tibble: 87 x 14
#>    name                mass birth_year eye_color films gender    hair_color    height
#>    <chr>              <dbl>      <dbl> <chr>     <lis> <chr>     <chr>          <int>
#>  1 Luke Skywalker        77       19.0 blue      <chr> masculine blond            172
#>  2 C-3PO                 75      112.0 yellow    <chr> masculine NA               167
#>  3 R2-D2                 32       33.0 red       <chr> masculine NA                96
#>  4 Darth Vader          136       41.9 yellow    <chr> masculine none             202
#>  5 Leia Organa           49       19.0 brown     <chr> feminine  brown            150
#>  6 Owen Lars            120       52.0 blue      <chr> masculine brown, grey      178
#>  7 Beru Whitesun lars    75       47.0 blue      <chr> feminine  brown            165
#>  8 R5-D4                 32         NA red       <chr> masculine NA                97
#>  9 Biggs Darklighter     84       24.0 brown     <chr> masculine black            183
#> 10 Obi-Wan Kenobi        77       57.0 blue-gray <chr> masculine auburn, white    182
#> # ... with 77 more rows, and 6 more variables: homeworld <chr>, sex <chr>,
#> #   skin_color <chr>, species <chr>, starships <list>, vehicles <list>
mefy6pfw

mefy6pfw5#

我们可以定义:

abc <- function(..., desc = FALSE) {
  data <- tidyselect::peek_data()
  named_selection <- tidyselect::eval_select(rlang::expr(c(...)), data)
  named_selection[order(names(named_selection), named_selection, decreasing = desc)]
}

与其他解决方案不同,您可以在任何整洁的选择周围调用它,但在我们的情况下,它只能是:

df %>% select(abc(everything()))
5f0d552i

5f0d552i6#

为什么不:

sort(colnames(df.x))

[1] "delta"  "ID"     "string"
cedebl8k

cedebl8k7#

使用dplyr

df.x %>% 
  select(sort(names(.)))
8i9zcol2

8i9zcol28#

由于没有答案提到relocate()

df |>
  dplyr::relocate(sort(names(df)))

https://dplyr.tidyverse.org/reference/relocate.html

相关问题