2016-04-16 17 views
4

等結合を使用するテーブルとローリング結合を使用するテーブルの2つのフィールドにテーブルを結合しようとしています。私が使用しているデータは以下の通りです:data.tableでの等結合とローリング結合

library(data.table) 
dt <- data.table(Date = as.Date(c("2015-12-29", "2015-12-29", "2015-12-29", "2015-12-29", "2016-01-30", "2016-01 -30", "2016-01-30", "2016-01-30", "2016-02-29", "2016-02-29", "2016-02-29", "2016-02-29", "2016-03-26", "2016-03-26", "2016-03-26", "2016-03-26")), 
        ID = c("A", "B", "C", "D", "A", "B", "C", "D", "A", "B", "C", "D", "A", "B", "C", "D"), 
       Value = c("A201512", "B201512", "C201512", "D201512", "A201601", "B201601", "C201601", "D201601", "A201602", "B201602", "C201602", "D201602", "A201603", "B201603", "C201603", "D201603"), key = c('Date', 'ID')) 

dtes <- data.table(Date=as.Date(c("2015-12-31", "2016-01-31", "2016-02-29", "2016-03-31")), key="Date") 

dte <- CJ(Date=dtes$Date, ID=unique(dt$ID)) 

私は(ローリングをジョインを使用して)テーブル「DT」とIDの「DTE」(等結合を使用)と日付に参加したい

dt[dte, roll=T] 

は私に

#   Date ID Value 
# 1: 2015-12-31 A  NA 
# 2: 2015-12-31 B  NA 
# 3: 2015-12-31 C  NA 
# 4: 2015-12-31 D  NA 
# 5: 2016-01-31 A  NA 
# 6: 2016-01-31 B  NA 
# 7: 2016-01-31 C  NA 
# 8: 2016-01-31 D  NA 
# 9: 2016-02-29 A A201602 
# 10: 2016-02-29 B B201602 
# 11: 2016-02-29 C C201602 
# 12: 2016-02-29 D D201602 
# 13: 2016-03-31 A  NA 
# 14: 2016-03-31 B  NA 
# 15: 2016-03-31 C  NA 
# 16: 2016-03-31 D  NA 

を与え、私は後だ結果がこれです:

# Date  ID  Value 
# 2016-03-31 A A201603 
# 2016-02-29 A A201602 
# 2016-01-31 A A201601 
# 2015-12-31 A A201512 
# 2016-03-31 B B201603 
# 2016-02-29 B B201602 
# 2016-01-31 B B201601 
# 2015-12-31 B B201512 
# 2016-03-31 C C201603 
# 2016-02-29 C C201602 
# 2016-01-31 C C201601 
# 2015-12-31 C C201512 
# 2016-03-31 D D201603 
# 2016-02-29 D D201602 
# 2016-01-31 D D201601 
# 2015-12-31 D D201512 

これはdata.tableで可能ですか?

+0

ええ、逆の順序でキーを設定してください。ロールはマージされる最後の列に移動します。 'setkey(dt、ID、Date); setkey(dte、ID、Date); dt [dte、roll = TRUE] [order(ID、-Date)] ' – Frank

+1

なぜ' on'を使わないのですか?メモリ内のデータを並べ替える必要がないので通常は高速です – jangorecki

+4

@janクラッシュしました。今すぐ報告する – Frank

答えて

1

ええ、逆の順序でキーを設定してください。

setkey(dt, ID, Date) 
setkey(dte, ID, Date) 
dt[dte, roll=TRUE][order(ID, -Date)] 


      Date ID Value 
1: 2016-03-31 A A201603 
2: 2016-02-29 A A201602 
3: 2016-01-31 A A201601 
4: 2015-12-31 A A201512 
5: 2016-03-31 B B201603 
6: 2016-02-29 B B201602 
7: 2016-01-31 B B201512 
8: 2015-12-31 B B201512 
9: 2016-03-31 C C201603 
10: 2016-02-29 C C201602 
11: 2016-01-31 C C201601 
12: 2015-12-31 C C201512 
13: 2016-03-31 D D201603 
14: 2016-02-29 D D201602 
15: 2016-01-31 D D201601 
16: 2015-12-31 D D201512 

または、代わりにsetkeyの、ちょうど正しい順序(上記のコメントで述べたバグが固定であると仮定した場合)にX[Y, on=cols, roll=TRUE]書き込みcolsを使用します。ロールは、マージされる最後の列になります。

関連する問題