在使用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>
1条答案
按热度按时间brc7rcf01#
这是一种方法,但是当键不唯一时,将丢失所有非第一行