是否有一种方法可以将列从data.frame中的一个位置移动到下一个位置 - 而无需键入全新的data.frame()
例如:
a <- b <- c <- d <- e <- f <- g <- 1:100
df <- data.frame(a,b,c,d,e,f,g)
Run Code Online (Sandbox Code Playgroud)
现在让我们说我想在"一个"面前"g"
我可以重新输入它
df <- data.frame(g,a,b,c,d,e,f)
Run Code Online (Sandbox Code Playgroud)
但是没有更快的方法吗?(想象一下1500+列)
Ken*_*ams 61
该subset函数有一个很好的select参数,可以方便地按名称选择列范围:
df <- subset(df, select=c(g,a:f))
Run Code Online (Sandbox Code Playgroud)
rcs*_*rcs 53
这是一种方法:
> col_idx <- grep("g", names(df))
> df <- df[, c(col_idx, (1:ncol(df))[-col_idx])]
> names(df)
[1] "g" "a" "b" "c" "d" "e" "f"
Run Code Online (Sandbox Code Playgroud)
A5C*_*2T1 50
我最近写了这个函数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
}
Run Code Online (Sandbox Code Playgroud)
用法很简单.试试这些:
moveme(names(df), "g first")
moveme(names(df), "g first; a last; e before c")
Run Code Online (Sandbox Code Playgroud)
当然,使用它来重新排序您的列data.frame是很简单的:
df[moveme(names(df), "g first")]
Run Code Online (Sandbox Code Playgroud)
而对于data.tables(通过引用移动,没有副本):
setcolorder(dt, moveme(names(dt), "g first"))
Run Code Online (Sandbox Code Playgroud)
基本选项是:
复合移动由分号分隔.
Sam*_*rke 46
使用select从dplyr包及其everything()功能到特定的列移动到data.frame的开始或结束.
移到开头:
library(dplyr)
df %>%
select(g, everything())
Run Code Online (Sandbox Code Playgroud)
移到最后:
df %>%
select(-a, everything())
Run Code Online (Sandbox Code Playgroud)
或者没有%>%管道操作员,那些将分别select(df, g, everything())和select(df, -a, everything()).
这是我的解决方案
df[c(7,1:6)]
Run Code Online (Sandbox Code Playgroud)
或者您也可以按列名称重新排序:
df[c("g",names(df)[-7])]
Run Code Online (Sandbox Code Playgroud)
relocate从dplyr包中使用
mtcars %>%
# dplyr::relocate(disp) %>% ## simply make disp the first column
relocate(starts_with("c"), .after = disp) %>% ## more complex column order shuffling
head(3)
Run Code Online (Sandbox Code Playgroud)
请注意,该功能是在 1.0 版中添加的,请参阅https://www.tidyverse.org/blog/2020/03/dplyr-1-0-0-select-rename-relocate/