R:仅在某些列中更改data.table中的列顺序

Pet*_*Pan 4 r data.table

我想在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函数来避免这种解决方法,不是吗?

akr*_*run 9

我们可以使用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)

这里的列没有引号传递,但扩展到字符向量很容易.

  • @Frank 感谢您的功能。 (2认同)

Val*_*tas 4

你可以这样做

\n\n
setcolorder(Data,c("Species","Petal.Length"))\n
Run Code Online (Sandbox Code Playgroud)\n\n

xcols与在 中使用类似kdb q?setcolorder说:

\n\n
\n

如果 \xe2\x80\x98length(neworder) < length(x)\xe2\x80\x99,则将指定的列按顺序移动到 \xe2\x80\x98x\xe2\x80\x99 的“前面”。

\n
\n\n

我的版本data.table1.11.4,但它也可能适用于早期版本。

\n