Select R中数据框的最后n列
Select the last n columns of data frame in R
有没有办法系统地 select 数据框的最后一列?我希望能够将最后一列移动到第一列,但在移动时保持列的顺序。我需要一种方法来做到这一点 not 使用 subset(data, select = c(all the columns listed in the new order)) 列出所有列,因为我会使用许多不同的数据框。
这是一个示例,我想将最后 2 列移到数据框的前面。它有效,但它很丑陋。
A = rep("A", 5)
B = rep("B", 5)
num1 = c(1:5)
num2 = c(36:40)
mydata2 = data.frame(num1, num2, A, B)
# Move A and B to the front of mydata2
mydata2_move = data.frame(A = mydata2$A, B = mydata2$B, mydata2[,1: (ncol(mydata2)-2)])
# A B num1 num2
#1 A B 1 36
#2 A B 2 37
#3 A B 3 38
#4 A B 4 39
#5 A B 5 40
更改原始数据框中的列数会导致问题。这有效(见下文),但命名被抛弃了。为什么这两个例子的行为不同?有没有更好的方法来做到这一点并将其推广?
mydata1_move = data.frame(A = mydata1$A, B = mydata1$B, mydata1[,1: (ncol(mydata1)-2)])
# A B mydata1...1..ncol.mydata1....2..
#1 A B 1
#2 A B 2
#3 A B 3
#4 A B 4
#5 A B 5
你可以使用这样的东西:
move_to_start <- function(x, to_move) {
x[, c(to_move, setdiff(colnames(x), to_move))]
}
move_to_start(mydata2, c('A', 'B'))
# A B num1 num2
# 1 A B 1 36
# 2 A B 2 37
# 3 A B 3 38
# 4 A B 4 39
# 5 A B 5 40
或者,如果您想将最后 n
列移到开头:
move_to_start <- function(x, n) {
x[, c(tail(seq_len(ncol(x)), n), seq_len(ncol(x) - n))]
}
move_to_start(mydata2, 2)
# A B num1 num2
# 1 A B 1 36
# 2 A B 2 37
# 3 A B 3 38
# 4 A B 4 39
# 5 A B 5 40
数据框只是列表,因此您可以像排列任何列表一样重新排列它们:
newdata <- c(mydata[colNamesToStart],
mydata[-which(names(mydata) %in% colNamesToStart)])
您可以使用 the SOfun
package 做类似的事情,在 GitHub 上可用。
library(SOfun)
foo <- moveMe(colnames(mydata2), "A, B before num1")
mydata2[, foo]
# A B num1 num2
#1 A B 1 36
#2 A B 2 37
#3 A B 3 38
#4 A B 4 39
#5 A B 5 40
您可以从 R 帮助中移动列名称,例如此示例。
x <- names(mtcars)
x
#[1] "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear" "carb"
moveMe(x, "hp first; cyl after drat; vs, am, gear before mpg; wt last")
#[1] "hp" "vs" "am" "gear" "mpg" "disp" "drat" "cyl" "qsec" "carb" "wt"
描述的问题与标题不符,现有的答案解决了移动列部分,并没有真正解释如何select 最后 N 列。
如果您只想 select matrix/data 框架中的最后一列而不知道列名:
mydata2[,ncol(mydata2)]
如果您想要最后 n 列,请尝试
mydata[,(ncol(mydata2)-n-1):ncol(mydata2)]
有点麻烦,但有效。如果你打算经常使用它,可以编写包装函数。
我知道这个话题有点死板,但想用一个简单的 dplyr
解决方案插话:
library(dplyr)
mydata <- mydata %>%
select(A, B, everything())
如果您想避免显式调用最后一列,请在 last_col()
中使用 seq()
。让我们将希望移动到前面的列数表示为 n
:
mydata <- mydata %>%
select(
last_col(seq(n - 1, 0)),
everything()
)
在 last_col
函数中使用 offset
参数,在 select
中,您可以做到这一点。
下面是考虑到最后两列的示例,它采用更通用的方法。
library(dplyr)
mydata <- mydata %>% select(last_col(offset=c(0,1)), everything())
n <- 2
mydata <- mydata %>% select(last_col(offset=0:(n-1), everything())
dplyr 的另一种选择:
mydata2 <- select(mydata, 2:ncol(data),1)
#select any cols from col2 until the last col and place them before col1
有没有办法系统地 select 数据框的最后一列?我希望能够将最后一列移动到第一列,但在移动时保持列的顺序。我需要一种方法来做到这一点 not 使用 subset(data, select = c(all the columns listed in the new order)) 列出所有列,因为我会使用许多不同的数据框。
这是一个示例,我想将最后 2 列移到数据框的前面。它有效,但它很丑陋。
A = rep("A", 5)
B = rep("B", 5)
num1 = c(1:5)
num2 = c(36:40)
mydata2 = data.frame(num1, num2, A, B)
# Move A and B to the front of mydata2
mydata2_move = data.frame(A = mydata2$A, B = mydata2$B, mydata2[,1: (ncol(mydata2)-2)])
# A B num1 num2
#1 A B 1 36
#2 A B 2 37
#3 A B 3 38
#4 A B 4 39
#5 A B 5 40
更改原始数据框中的列数会导致问题。这有效(见下文),但命名被抛弃了。为什么这两个例子的行为不同?有没有更好的方法来做到这一点并将其推广?
mydata1_move = data.frame(A = mydata1$A, B = mydata1$B, mydata1[,1: (ncol(mydata1)-2)])
# A B mydata1...1..ncol.mydata1....2..
#1 A B 1
#2 A B 2
#3 A B 3
#4 A B 4
#5 A B 5
你可以使用这样的东西:
move_to_start <- function(x, to_move) {
x[, c(to_move, setdiff(colnames(x), to_move))]
}
move_to_start(mydata2, c('A', 'B'))
# A B num1 num2
# 1 A B 1 36
# 2 A B 2 37
# 3 A B 3 38
# 4 A B 4 39
# 5 A B 5 40
或者,如果您想将最后 n
列移到开头:
move_to_start <- function(x, n) {
x[, c(tail(seq_len(ncol(x)), n), seq_len(ncol(x) - n))]
}
move_to_start(mydata2, 2)
# A B num1 num2
# 1 A B 1 36
# 2 A B 2 37
# 3 A B 3 38
# 4 A B 4 39
# 5 A B 5 40
数据框只是列表,因此您可以像排列任何列表一样重新排列它们:
newdata <- c(mydata[colNamesToStart],
mydata[-which(names(mydata) %in% colNamesToStart)])
您可以使用 the SOfun
package 做类似的事情,在 GitHub 上可用。
library(SOfun)
foo <- moveMe(colnames(mydata2), "A, B before num1")
mydata2[, foo]
# A B num1 num2
#1 A B 1 36
#2 A B 2 37
#3 A B 3 38
#4 A B 4 39
#5 A B 5 40
您可以从 R 帮助中移动列名称,例如此示例。
x <- names(mtcars)
x
#[1] "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear" "carb"
moveMe(x, "hp first; cyl after drat; vs, am, gear before mpg; wt last")
#[1] "hp" "vs" "am" "gear" "mpg" "disp" "drat" "cyl" "qsec" "carb" "wt"
描述的问题与标题不符,现有的答案解决了移动列部分,并没有真正解释如何select 最后 N 列。
如果您只想 select matrix/data 框架中的最后一列而不知道列名:
mydata2[,ncol(mydata2)]
如果您想要最后 n 列,请尝试
mydata[,(ncol(mydata2)-n-1):ncol(mydata2)]
有点麻烦,但有效。如果你打算经常使用它,可以编写包装函数。
我知道这个话题有点死板,但想用一个简单的 dplyr
解决方案插话:
library(dplyr)
mydata <- mydata %>%
select(A, B, everything())
如果您想避免显式调用最后一列,请在 last_col()
中使用 seq()
。让我们将希望移动到前面的列数表示为 n
:
mydata <- mydata %>%
select(
last_col(seq(n - 1, 0)),
everything()
)
在 last_col
函数中使用 offset
参数,在 select
中,您可以做到这一点。
下面是考虑到最后两列的示例,它采用更通用的方法。
library(dplyr)
mydata <- mydata %>% select(last_col(offset=c(0,1)), everything())
n <- 2
mydata <- mydata %>% select(last_col(offset=0:(n-1), everything())
dplyr 的另一种选择:
mydata2 <- select(mydata, 2:ncol(data),1)
#select any cols from col2 until the last col and place them before col1