26

我有以下数据表(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 与这种行为相同,但显然它们不是。有人能就正确的语法提供建议吗?

4

2 回答 2

34

常见问题解答 1.1、1.2 和 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')]与 adata.frame的作用相同,包含在?`[.data.frame`

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


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

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

因此:

DT[ , ..keep]
#    V1 V3
# 1:  1  7
# 2:  2  8
# 3:  3  9
于 2013-04-25T11:36:26.020 回答
3

更多可能性:

DT[, .SD, .SDcols = keep]
DT[, mget(keep)]
于 2020-09-23T15:42:03.813 回答