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

2024-01-01

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

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

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

键控连接只能equi joins. on论证对于有条件的 joins.

请注意,data.tables 不需要keyed if the on使用参数。即使您希望键入 data.tables,指定on更好,因为它有助于稍后立即理解代码。

请参阅开发版本的安装说明here https://github.com/Rdatatable/data.table/wiki/Installation.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将数据表滚动连接条件从弱不等式改为严格不等式? 的相关文章

随机推荐