如何将数据表滚动连接条件从弱不等式改为严格不等式



考虑以下两个数据集,其中' time '列表示一般时间戳,为了说明示例的简单性,使用整数:

library(data.table)
df_test_1 <- 
    data.table(time = c(1:10, seq(20, 30, by = 5))) %>%
df_test_1$values <- -df_test_1$time
df_test_1 <- setkey(df_test_1, time)
df_test_2 <-
    data.table(time = c(15, 20, 26, 28, 31))
df_test_2 <- setkey(df_test_2, time)

:

> df_test_1
    time values
 ...
 5:    5     -5
 6:    6     -6
 7:    7     -7
 8:    8     -8
 9:    9     -9
10:   10    -10
11:   20    -20
12:   25    -25
13:   30    -30

:

> df_test_2
   time
1:   15
2:   20
3:   26
4:   28
5:   31

轧制连接df_test_1[df_test_2, roll = -Inf]产生:

> df_test_1[df_test_2, roll = -Inf]
   time values
1:   15    -20
2:   20    -20
3:   26    -30
4:   28    -30
5:   31     NA

即对于df_test_1中的每一个time值,找出df_test_2 中小于等于其的所有time值,并将对应的valuedf_test_2的这一行相关联。例如,df_test_1$time == 20df_test_2$time中的1520的时间值相匹配,则-20的对应值与df_test_2的这几行相关联。

我想将连接条件(上面粗体)更改为小于,也就是说,生成的答案应该是:

   time values
1:   15    -20
2:   20    -25
3:   26    -30
4:   28    -30
5:   31     NA

这里的区别在于df_test_1$time == 25的值应该与df_test_2的行匹配,其中df_test_2$time == 20 .

产生期望结果的另一种方法是从time:

中删除一小部分。
df_test_3 <-
    df_test_1 %>%
    mutate(time = time - 0.1) %>%
    setkey(time)

:

> df_test_3[df_test_2, roll = -Inf]
   time values
1:   15    -20
2:   20    -25
3:   26    -30
4:   28    -30
5:   31     NA

在数据的当前开发版本中使用新的non-equi连接特性。表,这很简单:

# v1.9.7+
df_test_1[df_test_2, on=.(time > time), mult="first"]

键连接只支持equi连接。on参数对于条件连接至关重要。

注意这里不需要数据。如果使用on参数,则将表设置为。即使你想输入数据。指定on更好,因为它有助于稍后立即理解代码。

最新更新