data.table列列表传递?我希望能够使用 data.table 在 R 中生成列的子集,这样我就可以提前确定其中的一些列,并将预定列表作为字符向量传递,然后与静态列列表组合。
\n也就是说,考虑到:
\na <- 1:4\nb <- 5:8\nc <- c('aa','bb','cc','dd')\ne <- 1:4\n\nz <- data.table(a,b,c,e)\nRun Code Online (Sandbox Code Playgroud)\n我想做这个:
\nz[, list(a,b)]\nRun Code Online (Sandbox Code Playgroud)\n产生以下输出:
\n a b\n1: 1 5\n2: 2 6\n3: 3 7\n4: 4 8\nRun Code Online (Sandbox Code Playgroud)\n但我想以某种类似于此的方式来做到这一点(几乎有效):
\ncols <- "b"\nz[, list(get(cols), a)]\nRun Code Online (Sandbox Code Playgroud)\n结果:\n请注意,它不返回存储在中的列的名称cols
V1 a\n1: 5 1\n2: 6 2\n3: 7 3\n4: 8 4\nRun Code Online (Sandbox Code Playgroud)\n但我需要使用多个元素来完成此操作cols(这不起作用):
cols <- c('a', 'b')\nz[, list(mget(cols), c)]\nRun Code Online (Sandbox Code Playgroud)\n上述产生以下错误:
\nError: value for \xe2\x80\x98a\xe2\x80\x99 not found\nRun Code Online (Sandbox Code Playgroud)\n我认为我的问题在于范围和环境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
Run Code Online (Sandbox Code Playgroud)
一个使用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
Run Code Online (Sandbox Code Playgroud)
请注意,get返回一个向量,该向量丢失了有关列名称的信息(除了手动将其添加回来之外,您无能为力),而mget返回一个命名列表。
根据上面z的cols例子:
要将变量中的列名称列表col与其他硬编码的列名称组合起来c,我们c(col, 'c')在调用中将它们组合在一个新的字符向量中data.table。我们可以使用“上一级”符号cols从内部引用j(内部的第二个参数) :[]..
z[, c(..cols, 'c')]
Run Code Online (Sandbox Code Playgroud)
感谢@thelatemail 为上述解决方案提供了基础。