如何将列列表传递到 data.table,其中一些列是预先确定的

Ste*_*one 5 r data.table

将字符向量和列名称作为data.table列列表传递?

\n

我希望能够使用 data.table 在 R 中生成列的子集,这样我就可以提前确定其中的一些列,并将预定列表作为字符向量传递,然后与静态列列表组合。

\n

也就是说,考虑到:

\n
a <- 1:4\nb <- 5:8\nc <- c('aa','bb','cc','dd')\ne <- 1:4\n\nz <- data.table(a,b,c,e)\n
Run Code Online (Sandbox Code Playgroud)\n

我想做这个:

\n
z[, list(a,b)]\n
Run Code Online (Sandbox Code Playgroud)\n

产生以下输出:

\n
   a b\n1: 1 5\n2: 2 6\n3: 3 7\n4: 4 8\n
Run Code Online (Sandbox Code Playgroud)\n

但我想以某种类似于此的方式来做到这一点(几乎有效):

\n
cols <- "b"\nz[, list(get(cols), a)]\n
Run Code Online (Sandbox Code Playgroud)\n

结果:\n请注意,它不返回存储在中的列的名称cols

\n
   V1 a\n1:  5 1\n2:  6 2\n3:  7 3\n4:  8 4\n
Run Code Online (Sandbox Code Playgroud)\n

但我需要使用多个元素来完成此操作cols(这不起作用):

\n
cols <- c('a', 'b')\nz[, list(mget(cols), c)]\n
Run Code Online (Sandbox Code Playgroud)\n

上述产生以下错误:

\n
Error: value for \xe2\x80\x98a\xe2\x80\x99 not found\n
Run Code Online (Sandbox Code Playgroud)\n

我认为我的问题在于范围和环境mget正在寻找哪些环境,但我无法弄清楚我到底做错了什么。另外,如何保留列标题?

\n

edd*_*ddi 5

这里有两个(几乎等效)选项。一种使用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返回一个命名列表。


Ste*_*one 2

将变量与列名与 data.table 中的硬编码列名组合

根据上面zcols例子:

要将变量中的列名称列表col与其他硬编码的列名称组合起来c,我们c(col, 'c')在调用中将它们组合在一个新的字符向量中data.table。我们可以使用“上一级”符号cols从内部引用j(内部的第二个参数) :[]..

z[, c(..cols, 'c')]
Run Code Online (Sandbox Code Playgroud)

感谢@thelatemail 为上述解决方案提供了基础。