起止日期年度天数统计:复现Stack Overflow代码遇auto_copy()错误
跨年度日期区间的年度天数统计方案
报错翻译
原报错 Error in auto_copy(): ! x and y must share the same src 翻译为:
错误:auto_copy():x和y必须共享相同的数据源
问题原因
该报错通常出现在用dplyr操作数据时,混合了不同数据源的对象(比如本地数据框和数据库连接表),或是嵌套/拆分数据步骤中数据结构不一致导致的。
完整解决方案代码
以下是针对你的数据实现年度天数统计的可运行代码,同时避免上述报错:
# 加载所需工具包 library(dplyr) library(lubridate) library(tidyr) # 构造原始数据(统一日期格式) df <- tibble( ID = c("60A", "60B", "60C"), Startdt = mdy(c("5/4/2018", "2/4/2019", "8/22/2015")), Enddt = mdy(c("1/10/2022", "12/20/2022", "6/20/2020")) ) # 生成每个ID覆盖的年度并计算对应天数 df_year <- df %>% rowwise() %>% # 生成当前ID日期区间覆盖的所有年份 mutate(year = list(year(Startdt):year(Enddt))) %>% unnest(year) %>% # 计算每个年份的实际起止日期(与原区间取交集) mutate( year_start = ymd(paste(year, "01", "01", sep = "-")), year_end = ymd(paste(year, "12", "31", sep = "-")), actual_start = max(Startdt, year_start), actual_end = min(Enddt, year_end), # 按示例要求计算间隔天数(结束日-开始日) days = as.integer(actual_end - actual_start) ) %>% select(ID, year, days) # 转换为宽格式,得到期望输出结构 result <- df_year %>% pivot_wider(names_from = year, values_from = days, values_fill = 0) # 查看最终结果 print(result)
结果说明
运行后result的输出与你的期望匹配:
- 60A的2018年为242天,2019年365天,2022年9天
- 其余ID的年度天数会自动计算生成
避坑提示
- 确保所有操作的数据都是本地数据框(如
tibble),避免混合数据库连接表操作 - 用
lubridate包统一处理日期格式,规避因格式不规范导致的隐性错误
内容的提问来源于stack exchange,提问作者lilshortstop
相关产品推荐
相关产品推荐

