将字符向量和列名传递给 data.table
作为列列表?
我希望能够使用 data.table 在 R 中生成列的子集,以便我可以更早地确定其中一些列并将预定列表作为字符向量传递,然后与列的静态列表组合。
也就是说,鉴于此:
a <- 1:4
b <- 5:8
c <- c('aa','bb','cc','dd')
e <- 1:4
z <- data.table(a,b,c,e)
我想做这个:z[, list(a,b)]
产生这个输出: a b
1: 1 5
2: 2 6
3: 3 7
4: 4 8
但我想以与此类似的某种方式来做(几乎有效):cols <- "b"
z[, list(get(cols), a)]
结果:请注意,它不会返回存储在
cols
中的列的名称。 V1 a
1: 5 1
2: 6 2
3: 7 3
4: 8 4
但我需要用多个 cols
的元素来做这件事(这不起作用):cols <- c('a', 'b')
z[, list(mget(cols), c)]
以上产生以下错误:Error: value for ‘a’ not found
我认为我的问题在于范围和环境 mget
正在查看,但我无法弄清楚我到底做错了什么。另外,如何保留列标题?
最佳答案
这里有两个(几乎等价的)选项。一个使用 lapply
:
z[, c(lapply(cols, get), list(c))]
# V1 V2 V3
#1: 1 5 aa
#2: 2 6 bb
#3: 3 7 cc
#4: 4 8 dd
还有一个使用
mget
:z[, c(mget(cols, inherits = TRUE), c = list(c))]
# a b c
#1: 1 5 aa
#2: 2 6 bb
#3: 3 7 cc
#4: 4 8 dd
请注意
get
返回一个丢失列名信息的向量(除了手动将其重新添加之外,您无能为力),而 mget
返回一个命名列表。
关于r - 如何将列列表传递给 data.table,其中一些是预先确定的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24274815/