我有以下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与这种行为相同,但显然它们不是。有人能提供正确的语法建议吗?
答案 0 :(得分:21)
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
答案 1 :(得分:1)
更多可能性:
DT[, .SD, .SDcols = keep]
DT[, mget(keep)]