【问题标题】:Extract a column from a data.table as a vector, by position按位置从 data.table 中提取列作为向量
【发布时间】:2013-12-01 08:08:24
【问题描述】:

如何按位置从 data.table 中提取列作为向量?以下是我尝试过的一些代码sn-ps:

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 我看不出你觉得有必要发表评论的理由。
  • @Mullefa:对于某些类型的指法数据,data.table 胜过 dplyr。使用它是 OP 的选择。

标签: r vector indexing data.table


【解决方案1】:

data.table 继承自类 data.frame。因此,它在内部是一个list(列向量),可以这样处理。

is.list(DT)
#[1] TRUE

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

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

【讨论】:

  • 是否可以维护data.table结构而不是转换为向量?这适用于多列吗?
  • ...如果您希望在特定列旁边的特定行数上对数据进行子集化(例如在本例中为第 2 列),您可以在前面添加一组额外的方括号查询。也就是说,如果您想要第 2 列的前 10 行,那么... DT[1:10][[2]] 谢谢这让我的代码更快!
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2017-10-20
    • 2011-04-24
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 2014-03-04
    相关资源
    最近更新 更多