R语言dplyr中使用join_by进行条件连接失败问题求助
解决办法
1. 先转换日期格式
你用read.csv读取的service_date、start、end都是字符串类型,between()函数无法识别字符串格式的日期范围,必须先把它们转成Date类型才能正常判断。
2. 条件连接后聚合时长
匹配对应时段的服务记录后,一个时段会对应多条服务数据,需要按每个时段(id+start+end)分组,把服务时长汇总求和。
完整可运行代码:
library(tidyverse) # 读取数据并转换日期格式 services <- read.csv("https://www.dropbox.com/scl/fi/04br87qn2wmpmoyaz95ri/services.csv?rlkey=vm7ib1xqne1ceawjnsmzeolf5&dl=1") %>% mutate(service_date = as.Date(service_date)) periods <- read.csv("https://www.dropbox.com/scl/fi/fow33g4ddroinspyi4xy8/periods.csv?rlkey=v9cr0thuh6pm0rc7qrhommkpe&dl=1") %>% mutate(start = as.Date(start), end = as.Date(end)) # 执行条件连接并计算时段内总服务时长 result <- periods %>% left_join(services, by = join_by(id, between(service_date, start, end))) %>% group_by(id, start, end) %>% summarize(total_service_duration = sum(service_duration, na.rm = TRUE), .groups = "drop") print(result)
原代码报错的原因
- 核心问题是日期格式错误:字符串类型的日期无法被
between()正确解析,导致条件连接逻辑失效。 - 就算不报错,直接连接会产生多对多匹配结果(一个时段对应多条服务记录),无法直接得到你需要的“时段内总时长”,必须通过分组聚合完成汇总。
内容的提问来源于stack exchange,提问作者st4co4
相关产品推荐
相关产品推荐

