是否有基本的R函数来动态排序data.frame列,类似于dplyr everything()?

时间:2019-11-06 16:08:21

标签: r

假设您有一个data.frame,并且希望使用基数R对列进行动态重新排序。输入数据将始终像这样。它将始终包含idmonthyear变量,以及可变数量的数据变量(表示为v1v2,{ {1}}等)

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) idmonth始终是前三列,然后将数据变量从列4开始。

year

我知道可以与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

但是我想使用基数R获得相同的输出。

我想出的最好的方法是

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] 的函数?

3 个答案:

答案 0 :(得分:10)

您可以使用setdiff

df1[, c(keep1, setdiff(names(df1), keep1))]

答案 1 :(得分:8)

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

答案 2 :(得分:5)

另一个选择

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

df1[, unique(c("id", "month", "year", names(df1)))]