我想在data.table的前面排序两列(在我的情况下为id和time)。说我有:
library(data.table)
Data <- as.data.table(iris)
并说我希望列的顺序为:
example <- Data
setcolorder(example,c("Species","Petal.Length","Sepal.Length",
"Sepal.Width","Petal.Length","Petal.Width"))
但我的实际数据表有更多变量,所以我想将其作为:
setcolorder(Data, c("Species","Petal.Length",
...all other variables in their original order...))
我玩过类似的东西:
setcolorder(Data,c("Species","Petal.Length",
names(Data)[!c("Species","Petal.Length")]))
但是我有一个问题是通过名称引用对字符向量名称(数据)进行子集化。另外,我确信我可以使用一些整洁的data.table函数来避免这种解决方法,不是吗?
答案 0 :(得分:8)
我们可以使用setdiff
对不在names
子集中的所有列名称进行子集化,即&#39; nm1&#39;,将其与&#39; nm1&#39;连接起来。在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"
这方面的便利功能是:
setcolfirst = function(DT, ...){
nm = as.character(substitute(c(...)))[-1L]
setcolorder(DT, c(nm, setdiff(names(DT), nm)))
}
setcolfirst(Data, Species, Petal.Length)
这里没有引号传递列,但扩展到字符向量很容易。
答案 1 :(得分:1)
这完全是对Akrun解决方案的一种嘲讽,使用了更多的功能分解和一个回指宏,因为,为什么不呢。
我不是编写R宏的专家,所以这可能是一个天真的解决方案。
> toFront <- function(vect, ...) {
c(..., setdiff(vect, c(...)))
}
> withColnames <- function(tbl, thunk) {
.CN = colnames(tbl)
eval(substitute(thunk))
}
> vect = c('c', 'd', 'e', 'a', 'b')
> tbl = data.table(1,2,3,4,5)
> setnames(tbl, vect)
> tbl
c d e a b
1: 1 2 3 4 5
> withColnames(tbl, setcolorder(tbl, toFront(.CN, 'a', 'b') ))
> tbl
a b c d e
1: 4 5 1 2 3
>
答案 2 :(得分:0)
你可以做
setcolorder(Data,c("Species","Petal.Length"))
类似于在xcols
中使用kdb q
。 ?setcolorder
说:
如果“ length(neworder)
我的data.table
版本是1.11.4
,但早期版本也可能可用。