2017-04-21 7 views
1

ちょっと、テーブルのエントリを重複させるときに、ロール結合ソリューションを完全に理解しているかどうかわかりません。私は試合がdata.old 'D' の場合を除いて正常に動作するために取得しています複数のマッチで結合を結合する

     date data.new data.old 
1: 2015-03-02 12:20:00 sample1  d 
2: 2016-03-02 12:20:00 sample3  a 
3: 2016-03-07 12:20:00 sample3  b 
4: 2016-04-02 12:20:00 sample3  c 

:ここ

はサンプルデータです:よう

new <- data.table(date = as.POSIXct(c("2016-03-01 12:20:00", "2016-03-01 12:20:00", "2016-04-02 12:20:00")), data.new = c("sample1","sample2","sample3")) 
new 
old <- data.table(date = as.POSIXct(c("2016-03-02 12:20:00", "2016-03-07 12:20:00", "2016-04-02 12:20:00", "2015-03-02 12:20:00")), data.old = c("a","b","c","d")) 
old 
setkey(new, date) 
setkey(old, date) 
new[old,roll=-Inf] 

出力が見えます。 新しいテーブルは、同様最初の2つのタイムスタンプを有するので、ロールは、理想的には、iは

     date data.new data.old 
    new: 2015-03-02 12:20:00 sample2  d 
    1: 2015-03-02 12:20:00 sample1  d 
    2: 2016-03-02 12:20:00 sample3  a 
    3: 2016-03-07 12:20:00 sample3  b 
    4: 2016-04-02 12:20:00 sample3  c 

「sample2の」とdata.newカラムとdata.old「D」の重複行を望んでいた最初の発生にマップすることだけが可能ですどんな指導も高く評価されます。使用

答えて

1

on <- old[new, roll = Inf, .(x.date, data.new, data.old)] 
no <- new[old, roll = -Inf] 

unique(rbindlist(list(on, no))) 

ができます:あなたのソリューションのための

   x.date data.new data.old 
1: 2015-03-02 12:20:00 sample1  d 
2: 2015-03-02 12:20:00 sample2  d 
3: 2016-04-02 12:20:00 sample3  c 
4: 2016-03-02 12:20:00 sample3  a 
5: 2016-03-07 12:20:00 sample3  b 
+0

おかげで..私はので、私が参加し、圧延に使用される最も近いタイムスタンプ試合で探していますので、私はちょうどそれをマッチさせたいです最も近いタイムスタンプがあり、複数の最も近いタイムスタンプがある場合は、その場合に行を複製したい(「サンプル1」と「サンプル2」が最も近いため、「d」の2つの行が必要です)。非等価結合を使用すると、あなたのソリューションのケースではすべてのより大きいタイムスタンプより大きいか小さいタイムスタンプを取得できます。 – PSraj

+0

@PSraj更新情報を参照してください、HTH – Jaap

+0

これは魅力的な作品です。 – PSraj