我正在尝试在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
警告(并且不会创建我想要的变量):
在
[.data.table
(setkey(dt,treatment),dt [posting_rel == 0, sum(current_balance),:检测到无效的.internal.selfref和 通过复制一份来修复 整表使得:=可以通过引用添加这个新列。晒黑 早些时候,这个data.table已被R复制(或已被创建 手动使用structure()或类似的)。避免键&lt; - ,名称&lt; - 和 attr&lt; - 当前(并且奇怪地)在R中可以复制整个data.table。 使用set *语法来避免复制:?set,?setnames和 ?SETATTR。此外,在R&lt; = v3.0.2中,列表(DT1,DT2)复制了整个DT1和 DT2(R的list()用于复制命名对象);请升级到 R> v3.0.2如果是咬人的话。如果此消息没有帮助,请 向datatable-help报告,以便修复根本原因。
事实上,当我将数据子集化为仅合并中所需的那些列时,它对我的数据也能正常工作(但不能保存到原始数据集中)。
这对我来说这是一个键控问题,但我明确地设置了每一步的键。我完全迷失了如何从这里调试它,因为除了我的完整数据集之外,我无法重复错误。
如果我将操作分解为步骤,则在合并步骤中会出现错误:
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)
}
仍然想了解发生了什么,也许是在这种情况下迭代分配变量的更好方法。
答案 0 :(得分:1)
使用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)]]
这并不能解决您遇到的错误,但我认为这是一种更好的方法。