假设您有一个data.frame,并且希望使用基数R对列进行动态重新排序。输入数据将始终像这样。它将始终包含id
,month
和year
变量,以及可变数量的数据变量(表示为v1
,v2
,{ {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)
,id
和month
始终是前三列,然后将数据变量从列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]
的函数?
答案 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)))]