gpt4 book ai didi

r - 在 for 循环中通过 `:=` 进行分配(R data.table)

转载 作者:行者123 更新时间:2023-12-04 21:13:35 27 4
gpt4 key购买 nike

我正在尝试在 for 中分配一些新变量循环(我正在尝试创建一些具有通用结构的变量,但它们依赖于子样本)。

我一生都在尝试在样本数据上重现这个错误,但我不能。这是有效的代码并了解我想做的事情的要点:

DT <- data.table(
id = rep(1:100, each = 20L),
period = rep(-9:10, 100L),
grp = rep(sample(4L, size = 100L, replace = TRUE), each = 20L),
y = runif(2000, min=0, max=5), key = c("id", "period")
)
DT[ , x := cumsum(y), by = id]
DT2 <- DT[id %in% seq(1, 100, by=2)]
DT3 <- DT[id %in% seq(1, 100, by=3)]

for (dd in list(DT, DT2, DT3)){
setkey(setkey(dd, grp)[dd[period==0, sum(x), by = grp], x_at_0_by_grp := V1], id, period)
}

这工作正常 - 但是,当我对自己的代码执行此操作时,它会生成无效 .internal.selfref警告(并且不会创建我想要的变量):

In [.data.table(setkey(dt, treatment), dt[posting_rel == 0, sum(current_balance), : Invalid .internal.selfref detected and fixed by taking a copy of the whole table so that := can add this new column by reference. At an earlier point, this data.table has been copied by R (or been created manually using structure() or similar). Avoid key<-, names<- and attr<- which in R currently (and oddly) may copy the whole data.table. Use set* syntax instead to avoid copying: ?set, ?setnames and ?setattr. Also, in R<=v3.0.2, list(DT1,DT2) copied the entire DT1 and DT2 (R's list() used to copy named objects); please upgrade to R>v3.0.2 if that is biting. If this message doesn't help, please report to datatable-help so the root cause can be fixed.



事实上,当我将我的数据子集到只有合并中需要的那些列时,它也可以很好地处理我的数据(尽管不会保存到原始数据集)。

这向我表明这是键控的问题,但我在每一步都明确设置键。我完全不知道如何从这里调试它,因为除了我的完整数据集之外,我无法重复出现错误。

如果我将操作分解为多个步骤,则在合并步骤中会出现错误:
for (dd in list(DT, DT2, DT3)){
dummy <- dd[period==0, sum(x), by = grp]
setkey(dd, grp)
dd[dummy, x_at_0_by_grp := V1] #***ERROR HERE***
setkey(dd, id, period)
}

快速更新——如果我用 lapply 转换这个也会产生错误而不是在 for 内环形。

任何想法到底发生了什么?

更新:我想出了一个解决方法:
nnames <- c("dt", "dt2", "dt3")

dt_list <- list(DT, DT2, DT3)

for (ii in 1:3){
dummy <- copy(dt_list[[ii]])
dummy[ , x_at_0_by_grp := sum(x[period == 0]), by=grp]
assign(nnames[ii], dummy)
}

仍然想了解发生了什么,也许是在这种情况下迭代分配变量的更好方法。

最佳答案

使用 20-30 个条件,将它们保留在列表之外(手动名称如 dt2 等)太笨拙,所以我假设您将它们全部放在 dt_list 中.

我建议只用你正在计算的统计数据制作表格,然后 rbind对他们:

xxt <- rbindlist(lapply(1:length(dt_list),function(i) 
dt_list[[i]][,list(cond=i,xx=sum(x[period==0])),by=grp]))

这创造了
    grp cond       xx
1: 1 1 623.3448
2: 2 1 784.8438
3: 4 1 699.2362
4: 3 1 367.7196
5: 1 2 323.6268
6: 4 2 307.0374
7: 2 2 447.0753
8: 3 2 185.7377
9: 1 3 275.4897
10: 4 3 243.0214
11: 2 3 149.6041
12: 3 3 166.3626

如果你真的想要这些变量,你可以很容易地合并回来。例如,对于 dt2 :
myi = 2
setkey(dt_list[[myi]],grp)[xxt[cond==myi,list(grp,xx)]]

这并不能解决您遇到的错误,但我认为这是一种更好的方法。

关于r - 在 for 循环中通过 `:=` 进行分配(R data.table),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29441469/

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