[英]r data.table: Subsetting and assignment by reference in a for loop
[英]Assignment via `:=` in a for loop (R data.table)
我試圖在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)
}
這很好 - 但是,當我對自己的代碼執行此操作時,它會生成Invalid .internal.selfref
警告(並且不會創建我想要的變量):
在
[.data.table
(setkey(dt,treatment),dt [posting_rel == 0,sum(current_balance),:通過獲取整個表的副本來檢測並修復無效的.internal.selfref:=可以添加此通過引用新的列。在較早的時候,這個data.table已被R復制(或者是使用結構()或類似方法手動創建的。)避免鍵< - ,名稱< - 和attr < - 當前在R中(和奇怪的是)可以復制整個data.table。使用set *語法來避免復制:?set,?setnames和?setattr。另外,在R <= v3.0.2中,list(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
循環lapply
,也會產生錯誤。
有什么想法在這里發生了什么?
更新:我做了一個解決方法:
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)]]
這並不能解決您遇到的錯誤,但我認為這是一種更好的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.