有没有办法系统地选择数据帧的最后一列?我希望能够将最后一列移动到第一列,但是在移动列时保持它们的顺序。我需要一种不使用子集列出所有列的方法(数据,选择= c(以新顺序列出的所有列)),因为我将使用许多不同的数据帧。

这是一个示例,我想将最后两列移到数据框的前面。它可以工作,但是很难看。

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

关于r - 选择R中数据帧的最后n列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28017141/

10-12 14:02
查看更多