R语言如何向dataframe批量添加含连续日期的多行数据?
报错原因
你用delhi_ra[nrow(delhi_ra) + 1000,]赋值新增行的写法不符合R data.frame的索引规则:R不支持跳过中间行直接给非连续的行号赋值,你现有数据最后一行行号是2342,直接指定2342+946=3288行的位置,中间2343到3287行完全空缺,就会抛出你看到的非连续位置赋值错误,而且这种写法本身也不会自动生成中间缺失的行。
实现步骤
按下面的代码操作即可批量补全日期到2025年,同时和原数据结构完全兼容:
- 先计算需要补全的日期序列
# 提取现有数据的最后日期 last_date <- max(delhi_ra$date, na.rm = TRUE) # 生成从最后日期次日到2025年目标截止日的逐日序列,可根据需求调整截止日期 fill_date_seq <- seq.Date(from = last_date + 1, to = as.Date("2025-05-31"), by = "day")
- 构造和原数据结构完全一致的新增行数据框
# 先创建以日期列为核心的空数据框,其余列初始化为NA add_rows <- data.frame( date = fill_date_seq, matrix( nrow = length(fill_date_seq), ncol = ncol(delhi_ra) - 1, dimnames = list(NULL, setdiff(colnames(delhi_ra), "date")) ) ) # 对齐列类型,避免合并时出现类型不匹配报错 library(dplyr) add_rows <- add_rows %>% as_tibble() %>% type_convert(col_types = spec(delhi_ra))
- 合并数据并填充固定值
# 按行拼接原数据和新增行 delhi_ra <- bind_rows(delhi_ra, add_rows) # 给所有行的avg_2017列补全NCAP目标值,包括新增的行 delhi_ra$avg_2017[is.na(delhi_ra$avg_2017)] <- 78.49
注意事项
- 后续如果需要给新增行的
value等其他列填预测值、计算值,直接在合并完成的delhi_ra上按行范围赋值即可,不需要再单独做新增行操作 - 优先用
dplyr::bind_rows做数据框行拼接,比原生rbind对列类型的兼容性更好,不容易出现日期、数值列被转成字符串的问题 - 合并完成后你原来写的ggplot绘图代码不需要调整,x轴到2025年的区间会自动渲染出NCAP目标参考线
内容的提问来源于stack exchange,提问作者shivansh ghildiyal
相关产品推荐
相关产品推荐

