【问题标题】:R data.table join with inequality conditions between left and right tableR data.table连接左右表之间的不等式条件
【发布时间】:2013-10-30 08:42:30
【问题描述】:

我看到了关于加入不等式条件R data.table join with inequality conditions 的问题,我问自己,我们将如何继续加入两个data.tables,这两个条件之间存在不等式条件?

这通常在时间序列中非常有趣,我们希望将一个表 X 与另一个 Y 连接,但连接应该选择 X 中的第一行,该行在小于 Y 中行的时间的时间范围内匹配。

dt <- data.table(rep(c("A", "B", "C"), 4), 5:16)
dt2 <- data.table(rep(c("A", "B", "C"), 4), 1:12)
cbind(dt,dt2)
    V1 V2 V1 V2
 1:  A  5  A  1
 2:  B  6  B  2
 3:  C  7  C  3
 4:  A  8  A  4
 5:  B  9  B  5
 6:  C 10  C  6
 7:  A 11  A  7
 8:  B 12  B  8
 9:  C 13  C  9
10:  A 14  A 10
11:  B 15  B 11
12:  C 16  C 12

现在,从 dt 中获取与变量 V1 上的 dt2 中的行匹配但 dt$V2 小于 dt2$V2 的行。

你会怎么做呢?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    您可以在此处使用roll 参数。

    timeresolution = 0.01
    dt[,V2 := V2 - timeresolution]
    
    setkeyv(dt,c("V1","V2"))
    setkeyv(dt2,c("V1","V2"))
    dt2[dt,roll=-Inf]
    
    > dt2[dt,roll=-Inf]
        V1 V2 V2.1
     1:  A  4    5
     2:  A  7    8
     3:  A 10   11
     4:  A 13   14
     5:  B  5    6
     6:  B  8    9
     7:  B 11   12
     8:  B 14   15
     9:  C  6    7
    10:  C  9   10
    11:  C 12   13
    12:  C 15   16
    

    【讨论】:

    • 我不明白使用 V2.prev 的原因。您的方法也适用于仅使用dtdt2,因为它们是:dt2[dt, roll = -Inf]
    • 你是对的。我不确定你想如何处理dtdt2 中可能有相同的V1,V2 组合并使用V2prev 来应对这种可能性的情况。
    • 不过,您使用roll 参数的方法可以帮助我解决此类问题。
    猜你喜欢
    • 2013-10-03
    • 2015-04-29
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 2013-09-13
    • 2016-11-12
    相关资源
    最近更新 更多