我想在data.table的前面排序两列(在我的情况下为id和time).说我有:
library(data.table)
Data <- as.data.table(iris)
Run Code Online (Sandbox Code Playgroud)
并说我希望列的顺序是:
example <- Data
setcolorder(example,c("Species","Petal.Length","Sepal.Length",
"Sepal.Width","Petal.Length","Petal.Width"))
Run Code Online (Sandbox Code Playgroud)
但我的实际数据表有更多的变量,所以我想将其作为:
setcolorder(Data, c("Species","Petal.Length",
...all other variables in their original order...))
Run Code Online (Sandbox Code Playgroud)
我玩过类似的东西:
setcolorder(Data,c("Species","Petal.Length",
names(Data)[!c("Species","Petal.Length")]))
Run Code Online (Sandbox Code Playgroud)
但我有一个问题是通过名称参考对字符向量名称(数据)进行子集化.另外,我确信我可以通过一些简洁的data.table函数来避免这种解决方法,不是吗?
我们可以使用setdiff
子集中所有不在names
'nm1' 子集中的列名称,将其与'nm1'连接在一起setcolorder
nm1 <- c("Species", "Petal.Length")
setcolorder(Data, c(nm1, setdiff(names(Data), nm1)))
names(Data)
#[1] "Species" "Petal.Length" "Sepal.Length" "Sepal.Width" "Petal.Width"
Run Code Online (Sandbox Code Playgroud)
对此的便利功能是:
setcolfirst = function(DT, ...){
nm = as.character(substitute(c(...)))[-1L]
setcolorder(DT, c(nm, setdiff(names(DT), nm)))
}
setcolfirst(Data, Species, Petal.Length)
Run Code Online (Sandbox Code Playgroud)
这里的列没有引号传递,但扩展到字符向量很容易.
你可以这样做
\n\nsetcolorder(Data,c("Species","Petal.Length"))\n
Run Code Online (Sandbox Code Playgroud)\n\nxcols
与在 中使用类似kdb q
。?setcolorder
说:
\n\n\n如果 \xe2\x80\x98length(neworder) < length(x)\xe2\x80\x99,则将指定的列按顺序移动到 \xe2\x80\x98x\xe2\x80\x99 的“前面”。
\n
我的版本data.table
是1.11.4
,但它也可能适用于早期版本。