选择R中最后n列数据帧

时间:2015-01-19 02:29:03

标签: r indexing dataframe

有没有办法系统地选择数据框的最后一列?我希望能够将最后一列移动到第一列,但在移动时保持列的顺序。我需要一种方法来做这个使用子集列出所有列(data,select = 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

7 个答案:

答案 0 :(得分:7)

描述的问题与标题不匹配,现有的答案解决了移动列部分,并没有真正解释如何选择最后N列。

如果您只想在矩阵/数据框中选择最后n列而不知道列名:

mydata2[,ncol(mydata2)]

如果您想要最后n列,请尝试

mydata[,(ncol(mydata2)-n-1):ncol(mydata2)]

有点累赘,但有效。如果您打算定期使用它,可以编写包装函数。

答案 1 :(得分:4)

您可以使用以下内容:

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

答案 2 :(得分:3)

你可以使用GitHub上提供的the SOfun package做类似的事情。

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" 

答案 3 :(得分:2)

数据框只是列表,因此您可以像重置任何列表一样重新排列它们:

newdata <- c(mydata[colNamesToStart],
             mydata[-which(names(mydata) %in% colNamesToStart)])

答案 4 :(得分:2)

我知道这个主题有点死了,但想用一个简单的library(dplyr) mydata <- mydata %>% select(A, B, everything()) 解决方案来填写:

{{1}}

希望这可以帮助任何未来的访问者解决这个问题。

答案 5 :(得分:1)

dplyr的另一种选择:

mydata2 <- select(mydata, 2:ncol(data),1)  
#select any cols from col2 until the last col and place them before col1

答案 6 :(得分:0)

last_col内的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()) 参数,您可以执行此操作。

下面是考虑最后两列的示例,并且采用了更为通用的方法。

ConfigureServices