cau*_*chy 10 r data.table
我试图将两个单独的变量名列表传递给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
Run Code Online (Sandbox Code Playgroud)
它也可以传递一个名单列表:
dt[,list(a,b)]
a b
1: 1 4
2: 2 5
3: 3 6
Run Code Online (Sandbox Code Playgroud)
但是当我需要传递多个列表时,它会返回正确的列,但会删除变量名称:
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
Run Code Online (Sandbox Code Playgroud)
为什么两个名单?我正在使用多个quote()'d变量列表.我已经阅读了FAQ问题1.6,我知道一个解决方法是使用带有= FALSE的字符向量.但我的实际用例涉及将名称和表达式的混合传递给函数,例如,
varnames <- quote(list(a,b))
expr <- quote(list(a*b, c+d))
function(dt, varnames, expr) {
dt[,c(varnames, expr)]
}
Run Code Online (Sandbox Code Playgroud)
我希望"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
Run Code Online (Sandbox Code Playgroud)
如何在data.table中组合多个列表,以便它仍然返回正确的列名?(我不完全确定这是否是一个data.table问题,或者我只是在尝试将R中的列表组合起来做傻事,但c()似乎做了我想做的事.)
另一种选择是提前构建完整的调用:
varnames[4:5] <- expr[2:3] # this results in `list(a, b, a * b, c + d)`
dt[, eval(varnames)]
Run Code Online (Sandbox Code Playgroud)
产生:
a b V3 V4
1: 1 4 4 17
2: 2 5 10 19
3: 3 6 18 21
Run Code Online (Sandbox Code Playgroud)
更一般地说,假设您有一个表达式的引用列表列表:
exprlist <- list(quote(list(a, b)), quote(list(c, c %% a)), quote(list(a + b)))
expr <- as.call(Reduce(function(x, y) c(as.list(x), as.list(y)[-1]), exprlist)) # @eddi
dt[, eval(expr)]
Run Code Online (Sandbox Code Playgroud)