考虑以下两个数据集,其中' 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
值,并将对应的value
与df_test_2
的这一行相关联。例如,df_test_1$time == 20
与df_test_2$time
中的15
和20
的时间值相匹配,则-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
更好,因为它有助于稍后立即理解代码。