Подтвердить что ты не робот

Dplyr:: select - Включая все другие столбцы в конце нового кадра данных (или начинающего или среднего)

При взаимодействии с данными я считаю функцию select() библиотеки dplyr отличным способом для упорядочивания столбцов фрейма данных.

Одно замечательное использование, если я работаю с df, имеющим много столбцов, я часто нахожу, что я помещаю две переменные рядом друг с другом для простого сравнения. При этом мне нужно прикрепить все остальные столбцы до или после. Я нашел функцию matches(".") супер удобным способом сделать это.

Например:

library(nycflights13)
library(dplyr)

# just have the five columns:
select(flights, carrier, tailnum, year, month, day) 

# new order for all column:
select(flights, carrier, tailnum, year, month, day, matches(".")) 
# matches(".")  attached all other columns to end of new data frame

Вопрос - Мне любопытно, есть ли лучший способ сделать это? Лучше в смысле быть более гибким.

Например, одна проблема: есть ли способ включить столбцы "все остальные" в начале или в середине нового data.frame? (Обратите внимание, что select(flights, matches("."), year, month, day, ) не дает желаемого результата, так как matches("."), прикрепленный ко всем столбцам, и year, month, day игнорируются, поскольку они являются повторениями существующих имен столбцов.)

4b9b3361

Ответ 1

Если вы хотите изменить порядок столбцов

Все остальные столбцы в конце:
select(flights, carrier, tailnum, year, month, day, everything()) 

Или в два шага, чтобы выбрать переменные, предоставленные в символьном векторе, one_of("x", "y", "z"):

col <- c("carrier", "tailnum", "year", "month", "day")
select(flights, one_of(col), everything()) 

Все остальные столбцы в начале:
select(flights, -one_of(col), one_of(col))

Если вы хотите снова добавить весь кадр данных, используя dplyr:

Весь кадр данных в конце:
bind_cols(select(flights, one_of(col)), flights)

Весь кадр данных в начале:
bind_cols(flights, select(flights, one_of(col)))

Ответ 2

Хотя это не очень элегантное решение, оно работает.

  select(flights, carrier, tailnum, 
one_of(setdiff(colnames(flights),c("carrier","tailnum","year"))),year)

Я использовал функцию setdiff для сравнения. поскольку select не принимает строковые аргументы, я использовал функцию one_of. Список многих функций утилиты для выбора аргумента можно найти в post.