Dplyr非等值连接不再支持join_by参数问题求助
修复方案
错误原因
报错源于join_by中的非等条件未明确区分左右表的列,同时需确保你的dplyr版本≥1.1.0(该版本才正式支持join_by语法的非等连接)。
修复后的代码(dplyr 1.1.0+)
library(dplyr) df <- tribble( ~unique_id, ~event_type, ~event_date, 'id_101', 'A_type_event', '2022-01-01', 'id_101', 'B_type_event', '2022-02-01', 'id_101', 'A_type_event', '2022-02-15', 'id_101', 'A_type_event', '2022-02-28', 'id_101', 'B_type_event', '2022-03-01', 'id_101', 'C_type_event', '2022-03-10', 'id_101', 'A_type_event', '2022-03-20', 'id_101', 'C_type_event', '2022-04-01' ) left_join( df %>% filter(event_type == "A_type_event"), # 左表:A类型事件 df %>% filter(event_type == "C_type_event"), # 右表:C类型事件 join_by(unique_id, x.event_date < y.event_date), # 明确左表event_date早于右表,且ID匹配 multiple = "first" # 保留每个A事件对应的第一个C事件 )
关键修改点
- 在
join_by中用x.和y.前缀区分左右表的event_date列,消除字段歧义 - 若dplyr版本过低,先执行
install.packages("dplyr")更新至1.1.0及以上版本
兼容低版本dplyr的方案(使用fuzzyjoin包)
如果无法更新dplyr,可借助fuzzyjoin包实现非等连接:
library(fuzzyjoin) library(dplyr) df %>% filter(event_type == "A_type_event") %>% fuzzy_left_join( df %>% filter(event_type == "C_type_event"), by = c("unique_id" = "unique_id", "event_date" = "event_date"), match_fun = list(`==`, `<`), # ID相等,左表日期早于右表 keep = FALSE ) %>% group_by(unique_id, event_date.x) %>% slice_head(n = 1) %>% # 保留每个A事件的第一个匹配C事件 ungroup()
内容的提问来源于stack exchange,提问作者Wes Furlong
相关产品推荐
相关产品推荐

