考虑以下两个数据集,其中带有 '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)
so that:
> 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
and:
> 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 == 20
匹配时间值15
and 20
in df_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
where df_test_2$time == 20
.
产生所需结果的另一种方法是从time
:
df_test_3 <-
df_test_1 %>%
mutate(time = time - 0.1) %>%
setkey(time)
so that:
> 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