簡體   English   中英

R data.table apply函數在所有行上具有多列輸入,並獲得合理的輸出

[英]R data.table apply function with multiple column input over all rows and get reasonable output

我正在嘗試將一個函數應用於data.table的所有行,同時使用多列作為輸入,其輸出可能是data.frame / matrix /每行你擁有一兩行。 我的data.table有800,000行。

這是我最接近的嘗試。 當然,這里發揮的作用是正確性,效率和對輸出結構的易用性。

library(data.table)
d0 = as.Date("2014/01/01")
sdays = seq(d0,d0+99,by=1)
gg=data.table(id=1:100,event_date = sdays)  
setkey(gg, id)

test_func = function(id,day){
  delta = day - d0
  if(delta == 0 ){
    rcomb = c(id, 0, 100, 1,0)
  } else if(delta != 100 ){
    r1 = c(id, 0, delta, 0, 0)
    r2 = c(id, delta, 100,   1, 0)
    rcomb = rbind(r1,r2)
  }
  rcomb
}

att = gg[, test_func( get("id"), get("event_date")), by=id]
att

關於如何使用快速data.table技巧的任何想法嗎? 我已經呆了好幾個小時了,而且距離還不很近:/至於輸出,我希望它是一個列表,每個原始行只有一個條目,這樣我就可以調用do.callrbind 謝謝!

因此,讓我舉一個理想的輸出示例,但是效率很低:

some_list = vector("list", 100)
for(i in 1:100) {
  some_list[[i]] <- test_func(gg$id[i], gg$event_date[i])
}
happy=do.call(rbind,some_list)
head(happy)
   [,1] [,2] [,3] [,4] [,5]
      1    0  100    1    0
r1    2    0    1    0    0
r2    2    1  100    1    0
r1    3    0    2    0    0
r2    3    2  100    1    0
r1    4    0    3    0    0

如果要為data.table創建4列,則類似以下內容的工作

test_func = function(day){
    delta = day - d0
    if(delta == 0 ){
        rcomb = list(0, 100, 1,0)
    } else if(delta != 100 ){
     rcomb <- list(c(0,delta), c(100,delta), c(0,1), c(0,0))

    }
    rcomb
}

att = gg[, test_func(event_date), by=id]
att

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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