我正在学习使用data.table包。我要做的其中一件事是将最后一列(“x”)移到第一列。以下是我对数据框的处理方式:
DF <- cbind(x, DF[1:ncol(DF)]) #Rearrange columns
我读了setcolorder并尝试了这个,但是我收到了错误
setcolorder(DT, c("x", 1: (length(DT)-1) ) )
有谁知道更好的解决方案?
答案 0 :(得分:25)
也许你可以使用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
使用您的方法的修改版本:
setcolorder(DT, c("X", names(DT)[1:(length(DT)-1)]))
或
setcolorder(DT, c(length(DT), 1:(length(DT)-1)))
为什么你的方法出错?您试图包括列名和数字列索引。使用其中一个,但不能两个。
我写了一个名为moveme
的函数(目前您可以找到at this Gist或at my blog)。输入一串“移动”命令,以分号分隔。这样可以让您非常灵活地在列中进行随机播放:
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
答案 1 :(得分:-1)
如果您想在第一列中使用x
,我认为以下语法将起作用DF <- cbind(x,DF)
或者如果你想在任何列中使用它,比如n
DF.combine <- cbind(DF[,1:(n-1)], x, DF[,n:ncol(DF)])# n should >1