【发布时间】:2015-07-15 17:17:49
【问题描述】:
我正在尝试将两个单独的变量名列表传递到 data.table (v1.9.4) 中。它返回正确的列,但会删除变量名。这按预期工作:
dt <- data.table(a=1:3, b=4:6, c=7:9, d=10:12)
dt
a b c d
1: 1 4 7 10
2: 2 5 8 11
3: 3 6 9 12
传递单个名称列表也可以正常工作:
dt[,list(a,b)]
a b
1: 1 4
2: 2 5
3: 3 6
但是当我需要传递多个列表时,它会返回正确的列但会去掉变量名:
dt[,c(list(a,b), list(c,d))]
V1 V2 V3 V4
1: 1 4 7 10
2: 2 5 8 11
3: 3 6 9 12
为什么是两个列表?我正在使用多个引用()的变量列表。我已阅读 FAQ 问题 1.6,并且我知道一种解决方法是使用 with=FALSE 的字符向量。但我的真实用例涉及将名称和表达式的混合传递给函数,例如,
varnames <- quote(list(a,b))
expr <- quote(list(a*b, c+d))
function(dt, varnames, expr) {
dt[,c(varnames, expr)]
}
我希望“varnames”列有它们的专有名称(如果你只传递一个类似的列表,它们就会这样做
dt[,list(a,b,a*b,c+d)]
a b V3 V4
1: 1 4 4 17
2: 2 5 10 19
3: 3 6 18 21
如何在 data.table 中组合多个列表,使其仍返回正确的列名? (我不完全确定这是否是 data.table 问题,或者我只是在尝试在 R 中组合列表的方式中做一些愚蠢的事情,但 c() 似乎做了我想做的事。)
【问题讨论】:
-
它适用于命名列表,但不确定这是否适合您的目的。
dt[,c(list(a = a, b = b), list(c = c,d = d))] -
有趣——谢谢!这当然是一种解决方法,它比常见问题解答 1.6 的解决方法更好,因为它也适用于表达式(不仅仅是变量名)。但我仍然想知道是否有一种方法可以组合未命名列表,以便它与常规(干净!)data.table 语法一起使用。 (或者,如果我在组合引用列表的方式上做了一些愚蠢的事情。)
-
@cauchy 你没有做错任何事,
data.table只是通过将未命名列表转换为命名列表来帮助你在简单列表的情况下,但它不能这样做更复杂的情况,因为意图不明确
标签: r data.table