簡體   English   中英

在for循環中通過`:=`進行賦值(R data.table)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM