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

时间:2016-06-30 01:23:14

标签: r data.table

考虑以下两个数据集,其中“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

也就是说,对于time中的每个df_test_1值,找到time 中小于或等于它的所有df_test_2,以及将相应的value与此df_test_2行相关联。例如,df_test_1$time == 2015中的时间值20df_test_2$time匹配,因此-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的{​​{1}}行匹配。

产生所需结果的另一种方法是从df_test_2$time == 20中取出一小部分:

time

这样:

df_test_3 <-
    df_test_1 %>%
    mutate(time = time - 0.1) %>%
    setkey(time)

1 个答案:

答案 0 :(得分:0)

在data.table的当前开发版本中使用新的non-equi连接功能,这很简单:

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

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

请注意,如果使用on参数,则无需将data.tables 键入。即使您希望键入data.tables,指定on也会更好,因为它有助于在以后立即理解代码。

请参阅devel版本here的安装说明。