2017-04-21 24 views
1

嘿,我不知道如果我完全理解滚动连接解决方​​案,特别是当涉及到表中的重复条目。多个匹配滚动连接

下面是一个简单的数据:

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] 

输出看起来像:

     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 

我正在比赛除了data.old 'd' 的情况下正常工作。 由于新表也有类似的前两个时间戳,卷刚能映射到第一次出现理想我想复制的一行data.old“d”与data.new列“SAMPLE2”

     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 

任何指导表示赞赏。

回答

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

感谢您的解决方案。我期待在最近的时间印记的比赛,所以我用滚动加入,所以我只是想匹配到最近的时间戳,如果有多个最近的时间戳记,我想在这种情况下复制行(所以我只想要“d”的两行,因为“样本1”和“样本2”是最接近的)。使用非平等加入我会得到所有时间戳比我在()解决方案案例中的时间戳更大或更小的时间戳所有更大的时间戳。 – PSraj

+0

@PSraj查看更新,HTH – Jaap

+0

感谢这工作像魅力。 – PSraj