簡體   English   中英

如何最好地將data.table的一列與同一data.table的另一列連接?

[英]How to best join one column of a data.table with another column of the same data.table?

我的數據

我有一個data.table DT ,當前( F0YR )和下一個( F1YR )會計年度末(FYE)編碼為整數。 由於每個下一個FYE最終將成為當前FYE,因此整數將在F1YRF0YR列中。 此外,我的數據包含每月觀察結果,因此相同的FYE將多次出現在數據集中:

library(data.table)
DT <- data.table(ID     = rep(c("A", "B"), each=9),
                 MONTH  = rep(100L:108L, times=2),
                 F0YR   = rep(c(1L, 4L, 7L), each=3, times=2),
                 F1YR   = rep(c(4L, 7L, 9L), each=3, times=2),
                 value  = c(rep(1:5, each=3), 6, 6, 7),
                 key    = "ID,F0YR")
DT
      ID MONTH F0YR F1YR value
 [1,]  A   100    1    4     1
 [2,]  A   101    1    4     1
 [3,]  A   102    1    4     1
 [4,]  A   103    4    7     2
 [5,]  A   104    4    7     2
 [6,]  A   105    4    7     2
 [7,]  A   106    7    9     3
 [8,]  A   107    7    9     3
 [9,]  A   108    7    9     3
[10,]  B   100    1    4     4
[11,]  B   101    1    4     4
...

我想做的事

對於每個IDF1YR組合,我想獲得IDF0YR組合的值。 例如:對於FOYR==4公司A的值為2 現在,我希望為ID=="A"F1YR==4所有組合添加一個附加列,該列設置為2,旁邊已經存在的值為1。

我嘗試了什么

intDT <- DT[CJ(unique(ID), unique(F0YR)), list(ID, F0YR, valueNew = value), mult="last"]
setkey(intDT, ID, F0YR)
setkey(DT, ID, F1YR)
DT <- intDT[DT]
setnames(DT, c("F0YR.1", "F0YR"), c("F0YR", "F1YR"))
DT
      ID F1YR valueNew MONTH F0YR value
 [1,]  A    4        2   100    1     1
 [2,]  A    4        2   101    1     1
 [3,]  A    4        2   102    1     1
 [4,]  A    7        3   103    4     2
 [5,]  A    7        3   104    4     2
 [6,]  A    7        3   105    4     2
 [7,]  A    9       NA   106    7     3
 [8,]  A    9       NA   107    7     3
 [9,]  A    9       NA   108    7     3
[10,]  B    4        5   100    1     4
[11,]  B    4        5   101    1     4
...

(請注意,我在這里使用mult="last" ,因為雖然值只會隨着F0YR或F1YR的變化而改變,但有時候它們不會改變,這只是我的領帶破壞者)。

我想要的是

這看起來很容易。 首先,我必須復制我的DT。 其次,因為我基本上加入了相同的data.table ,所有列名都有相同的名稱,我必須重命名它們。 我認為self join將是前進的方向,但我嘗試並嘗試過,無法得到一個好的解決方案。 我希望有一些簡單的東西,我只是沒有看到......有沒有人有線索? 或者我的數據設置方式實際上很難(可能是因為我有月度觀察,但只想加入季度或年度變化值)。

在這樣的用例中,口頭禪“首先聚合,然后加入”通常會有所幫助。 因此,從您的DT開始,並使用v1.8.1:

> agg = DT[,last(value),by=list(ID,F0YR)]
> agg
   ID F0YR V1
1:  A    1  1
2:  A    4  2
3:  A    7  3
4:  B    1  4
5:  B    4  5
6:  B    7  7

我稱之為agg因為我想不出一個更好的名字。 在這種情況下,你想要的last並不是真正的聚合,但是你知道我的意思。

然后按組引用更新DT 這里我們通過分組i

setkey(DT,ID,F1YR)
DT[agg,newcol:=V1]
    ID MONTH F0YR F1YR value newcol
 1:  A   100    1    4     1      2
 2:  A   101    1    4     1      2
 3:  A   102    1    4     1      2
 4:  A   103    4    7     2      3
 5:  A   104    4    7     2      3
 6:  A   105    4    7     2      3
 7:  A   106    7    9     3     NA
 8:  A   107    7    9     3     NA
 9:  A   108    7    9     3     NA
10:  B   100    1    4     4      5
11:  B   101    1    4     4      5
12:  B   102    1    4     4      5
13:  B   103    4    7     5      7
14:  B   104    4    7     5      7
15:  B   105    4    7     5      7
16:  B   106    7    9     6     NA
17:  B   107    7    9     6     NA
18:  B   108    7    9     7     NA

是對的嗎? 不確定我是否完全遵循。 那些操作應該非常快,沒有任何副本,並且應該擴展到大數據。 至少,這是意圖。

暫無
暫無

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

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