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
игнорируются, поскольку они являются повторениями существующих имен столбцов.)
Ответы
Ответ 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.