如何在循环调用中使用data.table生成变量的线性组合和更新表?

 断雁难飞_920 发布于 2023-02-07 19:01

我建议使用seta 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.

1 个回答
  • 我建议使用seta 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.

    2023-02-07 19:05 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有