12

我正在学习使用 data.table 包。我想做的一件事是将最后一列(“x”)移动到第一列。以下是我对数据框的处理方式:

DF <- cbind(x, DF[1:ncol(DF)]) #Rearrange columns

我阅读了 setcolorder 并尝试了这个,但我得到了一个错误

setcolorder(DT, c("x", 1: (length(DT)-1) ) )

有谁知道更好的解决方案?

4

2 回答 2

29

选项1

也许你可以使用setdiff

DT <- data.table(A = 1:2, B = 3:4, X = 5:6)
DT
#    A B X
# 1: 1 3 5
# 2: 2 4 6
setcolorder(DT, c("X", setdiff(names(DT), "X")))
DT
#    X A B
# 1: 5 1 3
# 2: 6 2 4

选项 2

使用您的方法的修改版本:

setcolorder(DT, c("X", names(DT)[1:(length(DT)-1)]))

或者

setcolorder(DT, c(length(DT), 1:(length(DT)-1)))

为什么你的方法有错误?您试图同时包含列名和数字列索引。使用其中一种,但不能同时使用。


选项 3

我编写了一个名为moveme(暂时您可以在此 Gist我的博客中找到)的函数。您输入一串“移动”命令,用分号分隔。这使您可以非常灵活地在列中随机播放:

DT <- data.table(matrix(1:20, ncol = 10, dimnames = list(NULL, LETTERS[1:10])))
DT
#    A B C D  E  F  G  H  I  J
# 1: 1 3 5 7  9 11 13 15 17 19
# 2: 2 4 6 8 10 12 14 16 18 20

setcolorder(DT, moveme(names(DT), "E, F first; B last; H, I before G"))
# DT
#     E  F A C D  H  I  G  J B
# 1:  9 11 1 5 7 15 17 13 19 3
# 2: 10 12 2 6 8 16 18 14 20 4
于 2013-10-27T15:27:16.020 回答
-1

如果您希望 x 在第一列中,我认为以下语法将起作用

DF <- cbind(x,DF)

或者,如果您希望它出现在任何列中,例如 n

DF.combine <- cbind(DF[,1:(n-1)], x, DF[,n:ncol(DF)])# n should >1
于 2013-10-27T17:31:26.737 回答