Существует ли базовая функция R для динамического упорядочивания столбцов data.frame, аналогичных dplyr everything ()? - PullRequest
5 голосов
/ 06 ноября 2019

Предположим, у вас есть data.frame, и вы хотите динамически переупорядочить столбцы, используя базу R. Входные данные всегда будут выглядеть примерно так. Он всегда будет содержать переменные id, month и year, а также переменное число переменных данных (обозначается как v1, v2, v3 и т. Д.)

df1 <- data.frame(
  id = 1:5,
  v1 = LETTERS[1:5],
  v2 = rep(2,5),
  v3 = rep(10,5),
  month = c("jan", "jan", "mar", "oct", "dec"),
  year = c(1999, 2001, 1984, 1979, 2019),
  stringsAsFactors = F)

Я хотел бы изменить порядокстолбцы, такие как id, месяц и год, всегда являются первыми тремя столбцами, а затем помещают переменные данных, начиная с столбца 4.

df2 <- data.frame(
  id = 1:5,
  month = c("jan", "jan", "mar", "oct", "dec"),
  year = c(1999, 2001, 1984, 1979, 2019),
  v1 = LETTERS[1:5],
  v2 = rep(2,5),
  v3 = rep(10,5),
  stringsAsFactors = F)

Я знаю, что это можно сделать с помощью dplyr :: select вдольс помощью dplyr :: everything.

library(dplyr)
df2 <- df1 %>% select(id, month, year, everything())

Но я бы хотел добиться того же результата, используя базу R.

Лучшее, что я придумал, это

keep1 <- c("id", "month", "year")
keep2 <- names(df1)[!names(df1) %in% keep1]
keep3 <- c(keep1, keep2)
df2 <- df1[, keep3]

Может ли быть более элегантное решение? Например, может быть в базе R есть функция, похожая на dplyr :: everything?

Ответы [ 3 ]

10 голосов
/ 06 ноября 2019

Вы можете использовать setdiff:

df1[, c(keep1, setdiff(names(df1), keep1))]
8 голосов
/ 06 ноября 2019
df1[order(match(names(df1), keep1, nomatch = NCOL(df1) + 1))]
#  id month year v1 v2 v3
#1  1   jan 1999  A  2 10
#2  2   jan 2001  B  2 10
#3  3   mar 1984  C  2 10
#4  4   oct 1979  D  2 10
#5  5   dec 2019  E  2 10
4 голосов
/ 06 ноября 2019

Другой вариант

df1[, unique(c(which(names(df1) %in% keep1), seq_along(df1)))]

или

df1[, unique(c("id", "month", "year", names(df1)))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...