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


77

如何从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

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

DT$y 
#[1] 3 4
is.vector(DT$y)
#[1] TRUE

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

DT[,y] 
#[1] 3 4
is.vector(DT[,y])
#[1] TRUE

这不给向量

DT[,2,with=FALSE]
#   y
#1: 3
#2: 4
is.vector(DT[,2,with=FALSE])
#[1] FALSE

那两个不起作用:

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

DT[,noquote(names(DT)[2])] # Doesn't work
#[1] y

这没有给出向量:

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

对于一般的制表数据,您应该签出dplyr ;)
Mullefa,2015年

22
@Mullefa我看不出您为什么需要此评论的原因。
罗兰

2
@Mullefa:对于某些类型的制表数据,data.table优于dplyr。使用它是OP的选择。
smci

Answers:


102

data.table从class继承data.frame。因此,它在list内部是(列向量的)并且可以这样处理。

is.list(DT)
#[1] TRUE

幸运的是,列表子设置(即[[)非常快,与[package data.table相比,它没有定义方法。因此,您可以简单地使用[[按索引提取:

DT[[2]]
#[1] 3 4

是否可以维护data.table结构而不是转换为向量?这是否适用于多列?
rmf

...并且如果您希望将数据划分为特定列旁边特定数量的行(例如在本例中为第2列),则可以在查询的前面添加一组额外的方括号。也就是说,如果您想要第2列的前10行,那么... DT [1:10] [[2]]谢谢,这使我的代码快了很多!
Ben G Small

4

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.