dplyr:在 R 中按字母顺序排列列
dply: order columns alphabetically in R
如果我有一个很大的 DF(成百上千)列,其中 col_names 按字母顺序随机分布:
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.
中剪切和粘贴整个数据列
例如,我回顾了这种方法,但这是 "sort" 按字母顺序排列的行,这不是我想要做的。
How to sort a dataframe by column(s)?
谢谢!
试试这个
df %>% select(noquote(order(colnames(df))))
或者只是
df[,order(colnames(df))]
2021 年 12 月更新
dplyr
的新版本 (>= 1.0.7) 在没有 noquote
的情况下工作:
df %>% select(order(colnames(df)))
在 dplyr 中执行此操作的另一种方法是:
iris %>%
select(sort(current_vars()))
current_vars()
returns 可排序的列名称,select()
将采用列名称的向量。
为什么不只是:
sort(colnames(df.x))
[1] "delta" "ID" "string"
如果一个(或多个)特定列必须是第一个(或最后一个),但其余的是有序的,您可以:
mtcars %>% tibble %>%
select("hp", sort(colnames(.)))
要使用最近的 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>
我们可以定义:
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()))
如果我有一个很大的 DF(成百上千)列,其中 col_names 按字母顺序随机分布:
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.
中剪切和粘贴整个数据列例如,我回顾了这种方法,但这是 "sort" 按字母顺序排列的行,这不是我想要做的。
How to sort a dataframe by column(s)?
谢谢!
试试这个
df %>% select(noquote(order(colnames(df))))
或者只是
df[,order(colnames(df))]
2021 年 12 月更新
dplyr
的新版本 (>= 1.0.7) 在没有 noquote
的情况下工作:
df %>% select(order(colnames(df)))
在 dplyr 中执行此操作的另一种方法是:
iris %>%
select(sort(current_vars()))
current_vars()
returns 可排序的列名称,select()
将采用列名称的向量。
为什么不只是:
sort(colnames(df.x))
[1] "delta" "ID" "string"
如果一个(或多个)特定列必须是第一个(或最后一个),但其余的是有序的,您可以:
mtcars %>% tibble %>%
select("hp", sort(colnames(.)))
要使用最近的 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>
我们可以定义:
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()))