Я недавно написал эту функцию под названием moveme
. Он предназначен для работы с векторами с целью перемешивания порядка столбцов.
Вот функция:
moveme <- function (invec, movecommand) {
movecommand <- lapply(strsplit(strsplit(movecommand, ";")[[1]],
",|\\s+"), function(x) x[x != ""])
movelist <- lapply(movecommand, function(x) {
Where <- x[which(x %in% c("before", "after", "first",
"last")):length(x)]
ToMove <- setdiff(x, Where)
list(ToMove, Where)
})
myVec <- invec
for (i in seq_along(movelist)) {
temp <- setdiff(myVec, movelist[[i]][[1]])
A <- movelist[[i]][[2]][1]
if (A %in% c("before", "after")) {
ba <- movelist[[i]][[2]][2]
if (A == "before") {
after <- match(ba, temp) - 1
}
else if (A == "after") {
after <- match(ba, temp)
}
}
else if (A == "first") {
after <- 0
}
else if (A == "last") {
after <- length(myVec)
}
myVec <- append(temp, values = movelist[[i]][[1]], after = after)
}
myVec
}
Использование просто. Попробуйте это:
moveme(names(df), "g first")
moveme(names(df), "g first; a last; e before c")
Конечно, использовать его для изменения порядка столбцов в вашем data.frame
просто:
df[moveme(names(df), "g first")]
И для data.table
с (перемещение по ссылке, без копии):
setcolorder(dt, moveme(names(dt), "g first"))
Основные опции:
Составные ходы разделяются точкой с запятой.