将含年度聚合值的行拆分为月度值行(R语言实现)
解决方案:将年度数据拆分为月度行
你可以用dplyr和lubridate包来轻松实现这个需求,步骤直观清晰:先把每一行重复12次对应12个月,再生成每个月的日期,最后将Total列的年度值平均分配到每个月。
完整代码示例
library(readr) library(dplyr) library(lubridate) # 读取你的数据 myData = read_delim("Date,b,c,d,Total\n2018,NA,NA,NA,12\n2018,0.5,0.5,NA,24\n2018,0.3,NA,0.5,36\n", delim=",") # 拆分年度行到月度 monthly_data <- myData %>% # 每行重复12次,同时生成标记月份的临时列 uncount(weights = 12, .id = "month") %>% # 生成每个月第一天的日期格式 mutate(Date = make_date(Date, month, 1)) %>% # 将年度总计值平均分配到每个月 mutate(Total = Total / 12) %>% # 移除临时的月份标记列(可选操作) select(-month) # 查看第一行拆分后的12个月数据 head(monthly_data, 12)
代码分步解释
uncount(weights = 12, .id = "month"):把每一行复制12份,同时生成month列记录1-12的月份序号,方便后续生成日期。make_date(Date, month, 1):结合原数据的年份、生成的月份序号,创建每个月第一天的标准日期(比如2018-01-01)。mutate(Total = Total / 12):将年度总计值除以12,得到月度平均分配值。
对应第一行的输出结果
# A tibble: 12 x 5 Date b c d Total <date> <dbl> <dbl> <dbl> <dbl> 1 2018-01-01 NA NA NA 1 2 2018-02-01 NA NA NA 1 3 2018-03-01 NA NA NA 1 4 2018-04-01 NA NA NA 1 5 2018-05-01 NA NA NA 1 6 2018-06-01 NA NA NA 1 7 2018-07-01 NA NA NA 1 8 2018-08-01 NA NA NA 1 9 2018-09-01 NA NA NA 1 10 2018-10-01 NA NA NA 1 11 2018-11-01 NA NA NA 1 12 2018-12-01 NA NA NA 1
关于之前Stack Overflow方案无效的可能原因
你提到的那篇回答大概率是针对按类别拆分聚合行的场景,而你的需求是按时间维度(月份)拆分,数据结构和拆分逻辑完全不同,所以直接套用不生效。上面的方案是针对你的时间拆分需求专门设计的,应该能完美解决问题。
内容的提问来源于stack exchange,提问作者nh_
相关产品推荐
相关产品推荐

