在R data.table
中,我可以使用此语法添加新列:
> 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
但是我如何在dt的前面插入c,如下所示:
c a b
1: 4 1 3
2: 6 2 4
我看了SO,发现有些人为cbind
建议data.frame
,但我在这里使用:=
语法更方便,所以我想知道是否有这是data.table
批准的方式。我的data.table
有大约100列,所以我不想全部列出来。
答案 0 :(得分:10)
更新:此功能现已合并到
data.table
的最新CRAN版本(从v1.11.0开始),因此不再需要安装开发版本才能使用此功能。从发行说明:
- setcolorder()现在接受少于ncol(DT)列移动到前面,#592。感谢@MichaelChirico的PR。
醇>
data.table
(v1.10.5)的当前开发版本具有setcolorder()
的更新,通过接受部分列列表使这种方式更加方便。首先放置提供的列,然后在现有顺序之后添加所有未指定的列。
Installation instructions for development branch here.
关于开发分支稳定性的注意事项:我已经运行了几个月,现在在v1.10.5中使用fread()
中的多线程版本(如果你处理的话,这个版本值得更新多GB .csv文件)我没有注意到我的使用有任何错误或回归。
library(data.table)
DT <- as.data.table(mtcars)
DT[1:5]
给出
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
根据部分列表重新排序列:
setcolorder(DT,c("gear","carb"))
DT[1:5]
现在给出了
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
如果由于任何原因您不想更新到开发分支,则以下(以及当前的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)]))