gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:05:56 24 4
gpt4 key购买 nike

一些玩具数据

set.seed(123)
df <- data.frame(what_ever = rnorm(5, 50, 1),
this_is = rnorm(5, 30, 1),
wtf_nnn = rnorm(5, 20, 1),
hat_ever = rnorm(5, 50, 1),
who_is = rnorm(5, 30, 1),
mmm_nnn = rnorm(5, 20, 1)
)


library(data.table)
DT <- data.table(df)

str(DT)
Classes ‘data.table’ and 'data.frame': 5 obs. of 6 variables:

如何在 data.table 中生成新变量
这是以下使用循环的结果?
New_Var_1 = what_ever/hat_ever
New_Var_2 = this_is/who_is
New_Var_3 = wtf_nnn/mmm_nnn

在这里我对列名进行排序
nm <- names(df)
nm1 <- nm[1:3]
nm2 <- nm[4:6]

我想以这种方式更新 DT,并且循环通过
i <- 1

New_Var_names <- paste("New_Var_", i, sep = "")
New_Var <- sprintf("%s/%s", nm1[i], nm2[i])

3 次尝试均无效。
DT[,New_Var_names := New_Var]
DT[,cat(New_Var_names) := cat(New_Var)]
DT[,eval(New_Var_names) := eval(New_Var)]

最佳答案

我建议使用 setfor-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]]])
}

在当前的开发版本 (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在您对 EVAL 的定义中.

关于r - 如何在循环调用中使用 data.table 生成变量的线性组合并更新表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20808374/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com