考虑以下两个数据集,其中“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 == 20
与15
中的时间值20
和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
的{{1}}行匹配。
产生所需结果的另一种方法是从df_test_2$time == 20
中取出一小部分:
time
这样:
df_test_3 <-
df_test_1 %>%
mutate(time = time - 0.1) %>%
setkey(time)
答案 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的安装说明。