R:仅在某些列

时间:2016-04-21 09:27:38

标签: r data.table

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

3 个答案:

答案 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,但早期版本也可能可用。