R data.table滚动连接生成多余行及引用赋值疑问
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行),但实际得到8行,其中id == 2 & roll_date == '2022-01-01'的所有组合都被输出。
当修改B中id == 2的pay_date为非精确匹配值时,问题消失:
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>
问题原因
这是因为滚动连接遇到精确匹配且连接键存在重复值时,data.table会返回所有可能的匹配组合:
- 你的案例中,A表内
id=2且roll_date=2022-01-01有2行,B表内相同条件也有2行,精确匹配时会产生2×2=4行匹配结果,而非预期的1对1匹配。 - 当修改B的日期为非精确匹配时,滚动逻辑会找到A中
roll_date小于等于目标日期的最近一行(此时A中id=2的两行日期相同,只会取其中一行),因此不会产生笛卡尔积式的多余行。
关于引用赋值:=的疑问
引用赋值:=本身和这个问题无关。你用:=创建roll_date列只是常规的列操作,不会影响滚动连接的匹配逻辑。问题的核心是连接键的重复值与精确匹配的组合,而非赋值方式。
内容的提问来源于stack exchange,提问作者Algebro1000
相关产品推荐
相关产品推荐

