我试图将两个独立的变量名列表传递到一个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
为什么有两份名单?我使用了多引号()d变量列表。我读过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)]
}
我希望“varname”列有它们正确的名称(如果您只传递一个列表,如
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()似乎做了我想做的事情。)
发布于 2015-05-05 13:20:18
另一种选择是提前构建完整的调用:
varnames[4:5] <- expr[2:3] # this results in `list(a, b, a * b, c + d)`
dt[, eval(varnames)]
生产:
a b V3 V4
1: 1 4 4 17
2: 2 5 10 19
3: 3 6 18 21
更笼统地说,假设您有一个引用的表达式列表:
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)]
发布于 2015-05-05 12:18:26
下面是使用.SD
的一个可能的解决办法
varnames <- quote(list(a,b))
expr <- quote(list(a*b, c+d))
myFunc <- function(dt, varnames, expr) {
dt[, c(.SD[, eval(varnames)], eval(expr))]
}
myFunc(dt, varnames, expr)
# a b V1 V2
# 1: 1 4 4 17
# 2: 2 5 10 19
# 3: 3 6 18 21
https://stackoverflow.com/questions/30062012
复制相似问题