10

私のデータ

DT現在 ( F0YR) と次 ( F1YR) の会計年度末 (FYE) が整数としてエンコードされた data.table があります。すべての次の FYE は最終的に現在の FYE になるため、整数は列F1YRとの両方になりますF0YR。また、私のデータには毎月の観測が含まれているため、同じ 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
...

私がしたいこと

すべてのIDand の組み合わせについて、 andF1YRの組み合わせの値を取得したいと思います。例: 会社 A の値はfor でした。ここで、既存の値 1 の横に、 and が 2 に設定されているすべての組み合わせの追加の列が必要です。IDF0YR2FOYR==4ID=="A"F1YR==4

私が試したこと

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、すべての列名が同じ名前になり、名前を変更する必要があります。私はaself joinが進むべき道だと思っていましたが、試してみましたが、良い解決策を得ることができませんでした. 私には見えない簡単なものがあることを願っています...誰か手がかりを持っていますか? または、実際には難しいようにデータが設定されていますか (おそらく、毎月の観測があるが、四半期ごとまたは年ごとに変化する値のみを結合したいため)。

4

1 に答える 1

6

このようなユースケースでは、「最初に集約してから、それと結合する」というスローガンが役立つことがよくあります。したがって、あなたから始めて、DTv1.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

そうですか?私が完全にフォローしたかどうかはわかりません。これらの操作は、コピーなしで非常に高速である必要があり、大規模なデータにスケーリングする必要があります。少なくとも、そのつもりです。

于 2012-06-14T16:04:45.357 に答える