itsource

dplyr: 열을 알파벳순으로 R 순서 지정

mycopycode 2023. 10. 4. 21:52
반응형

dplyr: 열을 알파벳순으로 R 순서 지정

다른 col_name을 가진 큰 DF(수백 개 및 수백 개) 열이 알파벳 순서로 랜덤하게 분포되어 있는 경우:

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에서 전체 데이터 열을 잘라 붙여넣는 것과 유사합니다.

예를 들어, 이 접근 방식을 검토했지만 이는 행을 알파벳 순으로 "분류"하는 것이며, 이는 제가 원하는 것이 아닙니다.

데이터 프레임을 열별로 정렬하는 방법은 무엇입니까?

감사합니다!

이거 먹어봐요.

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

아니면 그냥

df[,order(colnames(df))]

2021년 12월 업데이트

새 버전dplyr(>= 1.0.7).noquote:

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

이 작업을 수행할 수 있는 다른 방법입니다.dplyr사용하는 것입니다tidyselect::peek_vars

iris %>% 
  select(sort(tidyselect::peek_vars()))

current_vars()정렬 가능하도록 열 이름을 반환합니다.select()열 이름의 벡터를 사용합니다.

특정 열(또는 열)이 첫 번째 열(또는 마지막 열)이어야 하지만 나머지 열의 순서가 정해지면 다음을 수행할 수 있습니다.

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

최근 정리정돈을 사용한 부분 정렬(더 구체적으로,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>

옵션이 있는 경우starts_with():

library(dplyr)
df.x |> 
  select(starts_with(LETTERS))

사용.dplyr:

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

아직 답이 없기 때문에.relocate():

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

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

다음을 정의할 수 있습니다.

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()))

왜 그냥 안 되나요?

sort(colnames(df.x))

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

언급URL : https://stackoverflow.com/questions/29873293/dplyr-order-columns-alphabetically-in-r

반응형