3

トランザクションのサンプルがあります-顧客ID、トランザクションDATE、トランザクションVALUE(1日あたり最大1つのトランザクション)...すべてIDそれまでにDATE

N各顧客の最新のトランザクション(たとえば、最新の3つ)のみを保持する必要があります。それを行うためのベクトル化された方法はありますか?元のサンプルでは、​​何百万ものトランザクションがあります-FORループの実行には時間がかかりすぎます。

ID  DATE    VALUE
205 18.10.2010  19
209 30.09.2010  19
209 21.10.2010  19
209 07.11.2010  19
228 08.11.2010  159
237 24.10.2010  159
237 13.11.2010  200
248 30.09.2010  25
274 05.10.2010  19
274 11.10.2010  10
274 25.10.2010  19
274 05.11.2010  19
292 25.09.2010  159
292 03.10.2010  159
292 10.10.2010  159
292 26.10.2010  159
292 07.11.2010  159
310 18.10.2010  19
310 07.11.2010  19
310 19.11.2010  19
354 23.10.2010  19
354 02.11.2010  19
354 14.11.2010  19
354 22.11.2010  19
368 18.10.2010  19
369 25.09.2010  25
369 26.09.2010  25
369 27.09.2010  25
369 02.10.2010  25
369 04.10.2010  159
369 11.10.2010  20
369 15.10.2010  10
369 16.10.2010  19
369 23.10.2010  10
369 26.10.2010  10
369 29.10.2010  10
369 01.11.2010  10
369 02.11.2010  30
369 08.11.2010  10
369 13.11.2010  20
369 15.11.2010  70
369 23.11.2010  20
375 14.11.2010  159
382 11.10.2010  18
382 16.11.2010  20
387 26.10.2010  19
407 26.09.2010  25
407 04.10.2010  25
407 10.10.2010  70
407 25.10.2010  19
4

1 に答える 1

3

大量のデータがあり、速度が問題になるため、data.tableパッケージを使用する必要があります

あなたdata.frameがと呼ばれるオブジェクトにいる場合は、このようdatに強制しますdata.table

DT <- as.data.table(dat)

列の現在の形式はDATE簡単に並べ替えることができないため、最初に実際の日付を持つ新しい列を作成しましょう。data.tableパッケージでは、は:=参照演算子による割り当てです。

DT[, DATE2:=as.Date(DATE, "%d.%m.%Y")]

DATE2これで、Datesという名前の新しい列ができました。order日付で分割して IDから、最後の3つの値( )を取得できますtail(.SD, 3).SDdata.tableパッケージの「SubsetofData」の略です

> DT[order(DATE2), tail(.SD, 3), by=ID]
     ID       DATE VALUE      DATE2
 1: 292 10.10.2010   159 2010-10-10
 2: 292 26.10.2010   159 2010-10-26
 3: 292 07.11.2010   159 2010-11-07
 4: 369 13.11.2010    20 2010-11-13
 5: 369 15.11.2010    70 2010-11-15
 6: 369 23.11.2010    20 2010-11-23
 7: 407 04.10.2010    25 2010-10-04
 8: 407 10.10.2010    70 2010-10-10
 9: 407 25.10.2010    19 2010-10-25
10: 209 30.09.2010    19 2010-09-30
11: 209 21.10.2010    19 2010-10-21
12: 209 07.11.2010    19 2010-11-07
13: 248 30.09.2010    25 2010-09-30
14: 274 11.10.2010    10 2010-10-11
15: 274 25.10.2010    19 2010-10-25
16: 274 05.11.2010    19 2010-11-05
17: 382 11.10.2010    18 2010-10-11
18: 382 16.11.2010    20 2010-11-16
19: 205 18.10.2010    19 2010-10-18
20: 310 18.10.2010    19 2010-10-18
21: 310 07.11.2010    19 2010-11-07
22: 310 19.11.2010    19 2010-11-19
23: 368 18.10.2010    19 2010-10-18
24: 354 02.11.2010    19 2010-11-02
25: 354 14.11.2010    19 2010-11-14
26: 354 22.11.2010    19 2010-11-22
27: 237 24.10.2010   159 2010-10-24
28: 237 13.11.2010   200 2010-11-13
29: 387 26.10.2010    19 2010-10-26
30: 228 08.11.2010   159 2010-11-08
31: 375 14.11.2010   159 2010-11-14
     ID       DATE VALUE      DATE2

または、key

これは同等ですが、おそらくより高速です

setkey(DT, DATE2, ID)
DT[, tail(.SD, 3), by=ID]
于 2012-12-05T21:43:14.703 に答える