R data.table计算新列,但追加到开头

use*_*285 6 r data.table

在R data.tables中,我可以使用此语法添加新列:

> dt <- data.table(a=c(1,2), b=c(3,4))
> dt[, c := a + b]
> dt
   a b c
1: 1 3 4
2: 2 4 6
Run Code Online (Sandbox Code Playgroud)

但是我怎么会把c放在dt的前面呢:

   c a b
1: 4 1 3
2: 6 2 4
Run Code Online (Sandbox Code Playgroud)

我看了SO,发现有些人建议使用cbind cbind,但是我在data.frame这里使用语法更方便,所以我想知道是否有一个:=受制裁的方法.我data.table有大约100列,所以我不想全部列出.

Mat*_*ill 10

更新:此功能现已合并到最新的CRAN版本data.table(从v1.11.0开始),因此不再需要安装开发版本才能使用此功能.从发行说明:

  1. setcolorder()现在接受少于ncol(DT)列移动到前面,#592.感谢@MichaelChirico的PR.

data.table(v1.10.5)的当前开发版本具有更新setcolorder(),通过接受部分列列表使这种方式更加方便.首先放置提供的列,然后在现有顺序之后添加所有未指定的列.

这里有开发分支的安装说明.

关于开发分支稳定性的注意事项:我现在已经运行了几个月来使用fread()v1.10.5中的多线程版本(如果你处理多GB .csv文件,那么单独值得更新)我没有注意到我使用的任何错误或回归.

library(data.table)
DT <- as.data.table(mtcars)
DT[1:5]
Run Code Online (Sandbox Code Playgroud)

    mpg cyl disp  hp drat    wt  qsec vs am gear carb
1: 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
2: 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
3: 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
4: 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
5: 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Run Code Online (Sandbox Code Playgroud)

根据部分列表重新排序列:

setcolorder(DT,c("gear","carb"))
DT[1:5]
Run Code Online (Sandbox Code Playgroud)

现在给

   gear carb  mpg cyl disp  hp drat    wt  qsec vs am
1:    4    4 21.0   6  160 110 3.90 2.620 16.46  0  1
2:    4    4 21.0   6  160 110 3.90 2.875 17.02  0  1
3:    4    1 22.8   4  108  93 3.85 2.320 18.61  1  1
4:    3    1 21.4   6  258 110 3.08 3.215 19.44  1  0
5:    3    2 18.7   8  360 175 3.15 3.440 17.02  0  0
Run Code Online (Sandbox Code Playgroud)

如果由于任何原因您不想更新到开发分支,则以下(以及当前的CRAN)版本中的以下内容适用.

newCols <- c("gear","carb")
setcolorder(DT,c(newCols, setdiff(newCols,colnames(DT)) ## (Per Frank's advice in comments)

## the long way I'd always done before seeing setdiff()
## setcolorder(DT,c(newCols,colnames(DT)[which(!colnames(DT) %in% newCols)]))
Run Code Online (Sandbox Code Playgroud)