我建议使用set
a for-loop
来执行此操作,但在当前稳定版(CRAN)1.8.10版中,set
不添加新列.所以,我会做类似的事情:
require(data.table) out_names <- paste("newvar", 1:3, sep="_") DT[, c(out_names) := 0] invar1 <- names(DT)[1:3] invar2 <- names(DT)[4:6] for (i in seq_along(invar1)) { set(DT, i=NULL, j=out_names[i], value=DT[[invar1[i]]]/DT[[invar2[i]]]) }
在当前的devel版本(1.8.11)中,set
可以添加新列.因此,您不需要使用分配:=
.那是:
require(data.table) out_names <- paste("newvar", 1:3, sep="_") invar1 <- names(DT)[1:3] invar2 <- names(DT)[4:6] for (i in seq_along(invar1)) { set(DT, i=NULL, j=out_names[i], value=DT[[invar1[i]]]/DT[[invar2[i]]]) }
为了完整性,另一种方法是:
EVAL = function(...)eval(parse(text=paste0(...))) # helper function New_Var_names <- paste("New_Var_", i, sep = "") New_Var <- sprintf("%s/%s", nm1[i], nm2[i]) for (i in 1:3) EVAL("DT[,", New_Var_names[i], ":=", New_Var[i], "]")
这是更普遍的,你也可以改变运营商/
在sprintf
和改变by=
太条款等它类似于构建一个动态SQL语句,如果没有什么帮助.如果要记录正在执行的动态查询,可以cat
在定义中添加a EVAL
.
我建议使用set
a for-loop
来执行此操作,但在当前稳定版(CRAN)1.8.10版中,set
不添加新列.所以,我会做类似的事情:
require(data.table) out_names <- paste("newvar", 1:3, sep="_") DT[, c(out_names) := 0] invar1 <- names(DT)[1:3] invar2 <- names(DT)[4:6] for (i in seq_along(invar1)) { set(DT, i=NULL, j=out_names[i], value=DT[[invar1[i]]]/DT[[invar2[i]]]) }
在当前的devel版本(1.8.11)中,set
可以添加新列.因此,您不需要使用分配:=
.那是:
require(data.table) out_names <- paste("newvar", 1:3, sep="_") invar1 <- names(DT)[1:3] invar2 <- names(DT)[4:6] for (i in seq_along(invar1)) { set(DT, i=NULL, j=out_names[i], value=DT[[invar1[i]]]/DT[[invar2[i]]]) }
为了完整性,另一种方法是:
EVAL = function(...)eval(parse(text=paste0(...))) # helper function New_Var_names <- paste("New_Var_", i, sep = "") New_Var <- sprintf("%s/%s", nm1[i], nm2[i]) for (i in 1:3) EVAL("DT[,", New_Var_names[i], ":=", New_Var[i], "]")
这是更普遍的,你也可以改变运营商/
在sprintf
和改变by=
太条款等它类似于构建一个动态SQL语句,如果没有什么帮助.如果要记录正在执行的动态查询,可以cat
在定义中添加a EVAL
.