按位置从data.table中提取列作为向量

Wet*_*eet 67 indexing r vector data.table

如何从data.table中提取列作为向量的列?以下是我尝试过的一些代码片段:

DT<-data.table(x=c(1,2),y=c(3,4),z=c(5,6))
DT
#   x y z
#1: 1 3 5
#2: 2 4 6
Run Code Online (Sandbox Code Playgroud)

我想使用列位置获取此输出

DT$y 
#[1] 3 4
is.vector(DT$y)
#[1] TRUE
Run Code Online (Sandbox Code Playgroud)

使用列位置获取此输出的其他方法

DT[,y] 
#[1] 3 4
is.vector(DT[,y])
#[1] TRUE
Run Code Online (Sandbox Code Playgroud)

这不会给出矢量

DT[,2,with=FALSE]
#   y
#1: 3
#2: 4
is.vector(DT[,2,with=FALSE])
#[1] FALSE
Run Code Online (Sandbox Code Playgroud)

这两个不起作用:

DT$noquote(names(DT)[2]) # Doesn't work
#Error: attempt to apply non-function

DT[,noquote(names(DT)[2])] # Doesn't work
#[1] y
Run Code Online (Sandbox Code Playgroud)

这不会给出一个向量:

DT[,noquote(names(DT)[2]),with=FALSE] # Not a vector
#   y
#1: 3
#2: 4
is.vector(DT[,noquote(names(DT)[2]),with=FALSE])
#[1] FALSE
Run Code Online (Sandbox Code Playgroud)

Rol*_*and 91

data.table继承自类data.frame.因此,它是list(内部的列向量)并且可以如此处理.

is.list(DT)
#[1] TRUE
Run Code Online (Sandbox Code Playgroud)

幸运的是,列表子集,即[[非常快[,与之相反,包data.table没有为它定义方法.因此,您可以简单地使用[[索引提取:

DT[[2]]
#[1] 3 4
Run Code Online (Sandbox Code Playgroud)

  • 当然是.请参阅data.table插图. (2认同)
  • ...如果您希望在特定列旁边的特定行数上对数据进行子集化(例如,在本例中为第 2 列),则可以在查询前面添加一组额外的方括号。也就是说,如果您想要第 2 列的前 10 行,那么... DT[1:10][[2]] 谢谢,这使我的代码更快! (2认同)

lok*_*kxs 5

DT[,get(names(DT)[colNb])]

其中 colNb 可以是整数(所需的列号)或包含列号的变量。