如何在R中补全至年末日期并重复最新scalingvalue等列值
问题需求
可复现示例代码
name <- c("A","B","B","C","C","C") date <- c('2024-01-01', '2024-01-01', '2024-02-01', '2024-01-01','2024-02-01','2024-03-01') value <- c("1.0","1.2","1.2","0.6","0.6","0.6") count <- c("1","1","2","1","2","3") df <- data.frame(name,date,value,count) df %>% group_by(name)%>% mutate(scalingvalue = cumsum(as.numeric(value) / n()))
当前运行结果
name date value count scalingvalue A 2024-01-01 1.0 1 1 B 2024-01-01 1.2 1 0.6 B 2024-02-01 1.2 2 1.2 C 2024-01-01 0.6 1 0.2 C 2024-02-01 0.6 2 0.4 C 2024-03-01 0.6 3 0.6
最终目标
将每个name对应的日期补全至2024年末(即2024-12-01),新增日期对应的scalingvalue及其他列值需重复该name最新已有日期的对应值。示例目标结果如下:
name date value count scalingvalue A 2024-01-01 1.0 1 1 B 2024-01-01 1.2 1 0.6 B 2024-02-01 1.2 2 1.2 C 2024-01-01 0.6 1 0.2 C 2024-02-01 0.6 2 0.4 C 2024-03-01 0.6 3 0.6 C 2024-04-01 0.6 3 0.6 C 2024-05-01 0.6 3 0.6 C 2024-06-01 0.6 3 0.6 C 2024-07-01 0.6 3 0.6 C 2024-08-01 0.6 3 0.6 C 2024-09-01 0.6 3 0.6 C 2024-10-01 0.6 3 0.6 C 2024-11-01 0.6 3 0.6 C 2024-12-01 0.6 3 0.6
解决方案
可以使用dplyr、lubridate和tidyr包实现需求,代码如下:
library(dplyr) library(lubridate) library(tidyr) # 预处理数据:转换日期格式并计算scalingvalue df_processed <- df %>% mutate(date = ymd(date)) %>% group_by(name) %>% mutate(scalingvalue = cumsum(as.numeric(value) / n())) %>% ungroup() # 补全日期并填充缺失值 df_final <- df_processed %>% group_by(name) %>% # 生成从每组最早日期到2024年末的每月第一天序列 complete(date = seq(min(date), ymd("2024-12-01"), by = "month")) %>% # 将缺失列值填充为每组最后一行的有效值 fill(value, count, scalingvalue, .direction = "downup") %>% ungroup() # 输出结果 print(df_final)
代码说明
- 日期格式转换:将原始字符型的
date列转为日期格式,为后续生成日期序列做准备。 - 生成完整日期序列:按
name分组后,用complete()函数生成从每组最早日期到2024年末的每月第一天序列,自动补全缺失的日期行。 - 填充缺失值:用
fill()函数把新增行的value、count、scalingvalue填充为该组最后一行的有效值,保证新增日期的列值与最新已有日期一致。
内容的提问来源于stack exchange,提问作者chriswang123456
相关产品推荐
相关产品推荐

