簡體   English   中英

在R中的Data.table中使用Data.table

[英]Working with Data.table within Data.table in R

我試圖通過與另一個data.table進行交互來在data.table中建立一列,並且在沒有for循環的情況下無法正確引用變量來做到這一點。 輸入第二個data.table后,似乎不再能正確引用第一個data.table中的列。

這有點類似於使用另一個data.table設置data.table的子集,但是我認為合並樣式的解決方案不合適。

考慮類似

#used numbers instead of dates to not have to deal with formatting, but idea is the same.

dt1 <- data.table(id = c('a', 'b', 'c'), date1 = c(1.1, 5.4, 9.1), amt= '100')
dt2 <- data.table(date2 = c(1.3, 3, 6.4, 10.5),
              dt2col = c(1.5, 1.02, 1.005, .99)
              )

dt1[result := prod(dt2[date2-(date1)>0,
                              dt2col
                       ]
     )
     ]

我希望結果是dt1中的每個特定行的date2(在dt2中)晚於date1(在dt1中)時dt1中的新列,它是dt2col的乘積。 我認為(date1)部分是問題。

我希望result [1]都是dt2col的乘積,但僅在'5/4/2018'之后的日期,結果是dt2col的乘積,等等。

Try this:

dt1[,`:=`(date1 = as.Date.character(date1,format = "%d/%m/%Y"))]
dt2[,`:=`(date2 = as.Date.character(date2,format = "%d/%m/%Y"))]

dt1[,`:=`(inds = lapply(X = date1,function(t){
intersect(x = which(year(t)==year(dt2$date2)),
          y = which(as.integer(dt2$date2-t)>0))}))][,result:=
          lapply(X = inds,function(t){prod(dt2$dt2col[t])})]



#   id      date1 amt    inds   result
#1:  a 2018-01-01 100 1,2,3,4 1.522273
#2:  b 2018-04-05 100     1,4    1.485
#3:  c 2018-01-09 100     1,4    1.485

以下是一些data.table選項:

1)使用非等額聯接:

dt1[, result := dt2[dt1, on=.(date2 > date1), prod(dt2col), by=.EACHI]$V1]
dt1

2)在計算累積乘積后使用滾動聯接:

setorder(dt2, -date2)
dt2[, cprod := cumprod(dt2col)]
dt1[dt2, result := cprod, on=.(date1=date2), roll=Inf]

輸出:

   id date1 amt   result
1:  a   1.1 100 1.522273
2:  b   5.4 100 0.994950
3:  c   9.1 100 0.990000

暫無
暫無

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

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