gpt4 book ai didi

r - 如何将数据表rolling join条件从弱不等式改为严格不等式?

转载 作者:行者123 更新时间:2023-12-04 03:21:21 24 4
gpt4 key购买 nike

考虑以下两个数据集,其中“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 中的时间值 1520,因此-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.

产生所需结果的另一种方法是从时间中去掉一小部分:

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

最佳答案

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

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

Keyed 连接只能进行equi 连接。 on 参数对于条件 连接是必不可少的。

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

请参阅开发版本的安装说明 here .

关于r - 如何将数据表rolling join条件从弱不等式改为严格不等式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38112514/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com