注表情:我打了这个问题的确切问题并不适用于最新版本的数据表。如果您想按照标题中的描述进行操作,请查看包装常见问题解答1.6 OK, but I don’t know the expressions in advance. How do I programatically pass them in?中的相应问题。data.table`:=`分配与动态输入(现有列)和输出(新列名)
我看到an answer阐释如何构建表达在
DT[,j=eval(expr)]
我用这与工作分配进行评价,```:=`(mycol = my_calculation)``,我想知道...
- 如何动态地指定名称“mycol”?
- 让“my_calculation”采用动态确定的一组列的正确方法是什么?
“动态”,我的意思是“在我为我的expr
编写代码后确定”。
新的例子
编辑:为了更好地说明问题,这里是另一个例子。查看编辑历史记录以查看原件。
require(data.table)
require(plyr)
options(datatable.verbose=TRUE)
DT <- CJ(a=0:1,b=0:1,y=2)
# setup:
expr <- as.quoted(paste(expression(get(col_in_one)+get(col_in_two))))[[1]]
# usage:
col_in_one <- 'a'
col_in_two <- 'b'
col_out <- 'bah'
DT[,(col_out):=eval(expr)] # fails, should take the form j=eval(expr)
我想保持安装和使用阶段分开,所以我的代码更易于维护。我的真实表情比这个例子更混乱(它只是选择一列)。
问题
第一个问题:我怎样才能使分配到列, “col_out”,动态?我的意思是:我想在动态指定“cols_in_ *”和“col_out”。
我试图创造“expr的”各种表情,但as.quoted
抛出关于不把某些东西给=
符号左侧的错误。
第二个问题:我怎样才能避免对使用
get
的警告?
警告建议使用.SDcols
,让[.data.table
知道我正在使用哪些列。但是,如果我使用.SDcols
参数,另一个警告说除非使用.SD
,否则没有意义。
暂定解决方案
我到目前为止的解决方案是......
# Ricardo + eddi:
expr2 <- as.quoted(paste(expression(`:=`(
Vtmp=.SD[[col_in_one]]+.SD[[col_in_two]]))))[[1]]
# usage
col_in_one <- 'a'
col_in_two <- 'b'
col_out <- 'bah'
DT[,eval(expr2),.SDcols=c(col_in_one,col_in_two)]
setnames(DT,'Vtmp',col_out)
这还牵扯到做两步操作和跟踪“Vtmp”的小烦恼,所以第一个问题还是部分打开。
相关:HTTP:/ /stackoverflow.com/questions/15790743/data-table-meta-programming/15791747#15791747 –