dplyr :: select () для изменения порядка столбцов, которые могут не существовать - PullRequest
3 голосов
/ 15 апреля 2020

В dplyr, как я могу изменить порядок столбцов таблицы, основываясь на символьном векторе имен столбцов, который содержит переменные, которые могут или не могут существовать в таблице?

Я пытался select_if(names(.) %in% col_vector), но это не переупорядочивает столбцы.

Пример:

set.seed(1)
col_order <- c("a", "b", "c", "d", "e")
tibby <- tibble(d = rnorm(10), b = runif(10), a = rnorm(10))

select_if(tibby, names(tibby) %in% col_order)
# A tibble: 10 x 3
#        d      b       a
#    <dbl>  <dbl>   <dbl>
# 1 -0.626 0.935  -0.0449
# 2  0.184 0.212  -0.0162
# 3 -0.836 0.652   0.944 
# 4  1.60  0.126   0.821 
# 5  0.330 0.267   0.594 
# 6 -0.820 0.386   0.919 
# 7  0.487 0.0134  0.782 
# 8  0.738 0.382   0.0746
# 9  0.576 0.870  -1.99  
# 10 -0.305 0.340   0.620 

Ответы [ 3 ]

2 голосов
/ 15 апреля 2020

Вы можете сделать:

select(tibby, one_of(col_order))

         a      b      d
     <dbl>  <dbl>  <dbl>
 1 -0.0449 0.935  -0.626
 2 -0.0162 0.212   0.184
 3  0.944  0.652  -0.836
 4  0.821  0.126   1.60 
 5  0.594  0.267   0.330
 6  0.919  0.386  -0.820
 7  0.782  0.0134  0.487
 8  0.0746 0.382   0.738
 9 -1.99   0.870   0.576
10  0.620  0.340  -0.305
1 голос
/ 15 апреля 2020

Мы можем использовать intersect

library(dplyr)
tibby %>%
     select(intersect(col_order, names(.)))
# A tibble: 10 x 3
#         a      b      d
#     <dbl>  <dbl>  <dbl>
# 1 -0.0449 0.935  -0.626
# 2 -0.0162 0.212   0.184
# 3  0.944  0.652  -0.836
# 4  0.821  0.126   1.60 
# 5  0.594  0.267   0.330
# 6  0.919  0.386  -0.820
# 7  0.782  0.0134  0.487
# 8  0.0746 0.382   0.738
# 9 -1.99   0.870   0.576
#10  0.620  0.340  -0.305
0 голосов
/ 15 апреля 2020

Можно использовать match:

tibby[na.omit(match(col_order, names(tibby)))]

Если необходимо с dplyr, его можно использовать как:

library(dplyr)
tibby %>% select(na.omit(match(col_order, names(.))))

# A tibble: 10 x 3
#        a      b      d
#     <dbl>  <dbl>  <dbl>
# 1 -0.0449 0.935  -0.626
# 2 -0.0162 0.212   0.184
# 3  0.944  0.652  -0.836
# 4  0.821  0.126   1.60 
# 5  0.594  0.267   0.330
# 6  0.919  0.386  -0.820
# 7  0.782  0.0134  0.487
# 8  0.0746 0.382   0.738
# 9 -1.99   0.870   0.576
#10  0.620  0.340  -0.305
...