【问题标题】:How to select columns programmatically in a data.table?如何以编程方式在 data.table 中选择列?
【发布时间】:2013-04-19 06:44:30
【问题描述】:

我有以下 data.table (DT):

DT <- data.table(V1 = 1:3, V2 = 4:6, V3 = 7:9)

我想通过使用存储相关变量名称的对象以编程方式(动态)选择变量的子集。例如,我想选择存储在变量“keep”中的“V1”和“V3”两列

keep <- c("V1", "V3")

如果我们要从 data.frame 中选择“保留”列,则可以使用以下方法:

DT[keep]

不幸的是,当这是一个 data.table 时,这不起作用。我认为 data.frame 和 data.table 与这种行为相同,但显然它们不是。有人能就正确的语法提出建议吗?

【问题讨论】:

    标签: r dataframe data.table


    【解决方案1】:

    FAQ 1.1, 1.2 and 2.17 对此进行了介绍。

    一些可能性:

    DT[, keep, with = FALSE]
    DT[, c('V1', 'V3'), with = FALSE]
    DT[, c(1, 3), with = FALSE]
    DT[, list(V1, V3)]
    

    DF[c('V1','V3')]data.frame 一样工作的原因在?`[.data.frame` 中有所说明

    可以在多种模式下对数据帧进行索引。当使用[[[ 时 使用单个向量索引(x[i]x[[i]]),它们索引数据框 好像它是一个列表。在这种用法中,drop 参数被忽略,带有 警告。


    data.table 1.10.2 开始,您可以在以编程方式对列进行子集化时使用.. 前缀:

    j 是一个以.. 为前缀的符号时,它将在调用范围内查找,其值被视为列名或数字[...] 这是实验性的。

    因此:

    DT[ , ..keep]
    #    V1 V3
    # 1:  1  7
    # 2:  2  8
    # 3:  3  9
    

    【讨论】:

      【解决方案2】:

      更多可能性:

      DT[, .SD, .SDcols = keep]
      DT[, mget(keep)]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-15
        • 1970-01-01
        相关资源
        最近更新 更多