R数据.表滚动连接创建额外行

cu6pst1q  于 2022-12-30  发布在  其他
关注(0)|答案(1)|浏览(104)

在使用data.table的滚动连接功能时,我注意到数据中创建了一些额外的行。我尝试在较小的范围内重现这个问题:

A <- data.table(id = c(1, 2, 2, 3), 
            dod = as.Date(c('2022-08-01', '2022-01-01', '2022-01-01', '2022-03-01')), 
            sex = c('M', 'F', 'M', 'F'))

B <- data.table(id = c(1, 2, 2, 3, 4, 5), 
            pay_date = as.Date(c('2022-12-01', '2022-01-01', '2022-01-01', '2022-07-01', '2022-08-01', '2022-10-01')), 
            prem = c(100, 150, 120, 80, 160, 180))
A[, roll_date := dod]
B[, roll_date := pay_date]

运行A[B, on = .(id, roll_date), roll = T]时,我希望输出是一个与B长度相同的数据表,即6。但是,输出如下所示:

id        dod  sex  roll_date   pay_date prem
1:  1 2022-08-01    M 2022-12-01 2022-12-01  100
2:  2 2022-01-01    F 2022-01-01 2022-01-01  150
3:  2 2022-01-01    M 2022-01-01 2022-01-01  150
4:  2 2022-01-01    F 2022-01-01 2022-01-01  120
5:  2 2022-01-01    M 2022-01-01 2022-01-01  120
6:  3 2022-03-01    F 2022-07-01 2022-07-01   80
7:  4       <NA> <NA> 2022-08-01 2022-08-01  160
8:  5       <NA> <NA> 2022-10-01 2022-10-01  180

特别地,R输出键值id == 2 & roll_date == '2022-01-01'的所有组合,注意输出中的行都是不同的。
有趣的是,一旦没有精确匹配,假设我们将B中的pay_date更改为id == 2

B <- data.table(id = c(1, 2, 2, 3, 4, 5), 
            pay_date = as.Date(c('2022-12-01', '2022-02-01', '2022-02-01', '2022-07-01', '2022-08-01', '2022-10-01')), 
            prem = c(100, 150, 120, 80, 160, 180)),

问题消失。
出现这种情况的原因是什么?当我在滚动连接中使用引用赋值运算符:=时,是否会遇到类似的问题?
提前感谢您的帮助!

    • 编辑**

预期输出如下:

id   pay_date prem  roll_date id_b      dod_b sex_b roll_date_b
1:  1 2022-12-01  100 2022-12-01   NA       <NA>  <NA>        <NA>
2:  2 2022-01-01  150 2022-01-01    2 2022-01-01     F  2022-01-01
3:  2 2022-01-01  120 2022-01-01    2 2022-01-01     F  2022-01-01
4:  3 2022-07-01   80 2022-07-01    3 2022-09-01     M  2022-09-01
5:  4 2022-08-01  160 2022-08-01   NA       <NA>  <NA>        <NA>
6:  5 2022-10-01  180 2022-10-01   NA       <NA>  <NA>        <NA>
brc7rcf0

brc7rcf01#

这是一种方法,但是当键不唯一时,将丢失所有非第一行

library(data.table)

A <- data.table(id = c(1, 2, 2, 3), 
            dod = as.Date(c('2022-08-01', '2022-01-01', '2022-01-01', '2022-03-01')), 
            sex = c('M', 'F', 'M', 'F'))

B <- data.table(id = c(1, 2, 2, 3, 4, 5), 
            pay_date = as.Date(c('2022-12-01', '2022-01-01', '2022-01-01', '2022-07-01', '2022-08-01', '2022-10-01')), 
            prem = c(100, 150, 120, 80, 160, 180))

A[, roll_date := dod]
B[, roll_date := pay_date]

A[!duplicated(id,roll_date)][B, on = .(id, roll_date), roll = T]

#>    id        dod  sex  roll_date   pay_date prem
#> 1:  1 2022-08-01    M 2022-12-01 2022-12-01  100
#> 2:  2 2022-01-01    F 2022-01-01 2022-01-01  150
#> 3:  2 2022-01-01    F 2022-01-01 2022-01-01  120
#> 4:  3 2022-03-01    F 2022-07-01 2022-07-01   80
#> 5:  4       <NA> <NA> 2022-08-01 2022-08-01  160
#> 6:  5       <NA> <NA> 2022-10-01 2022-10-01  180

相关问题