在R中实现季度转月度数据时遇报错,求解决方案
解决季度转月度数据的代码报错问题
错误原因
你写的rep(rep(1:3, each = 2), 4)生成了24个元素,但原数据只有8行,mutate要求新增列的长度必须和原数据行数一致,因此触发报错。你需要先把每一行季度数据拆分成对应数量的行,再生成月份编号。
修正后的代码(匹配你的思路)
假设你希望每个季度的3个月份各重复2次(即每个季度对应6行数据),以下是调整后的代码:
library(tidyr) library(dplyr) # 原始数据 new_data <- data.frame( Year = c(2021, 2021, 2021, 2021, 2022, 2022, 2022, 2022), Quarter = c("1st Quarter", "2nd Quarter", "3rd Quarter", "4th Quarter", "1st Quarter", "2nd Quarter", "3rd Quarter", "4th Quarter"), Government_Expenditure = c(139.95, 132.93, 134.64, 141.10, 151.08, 140.79, 143.05, 149.32) ) monthly_data <- new_data %>% # 把每一行季度数据拆成6行(对应3个月份各重复2次) uncount(6) %>% # 按年份和季度分组,为每组生成重复的月份编号:1,1,2,2,3,3 group_by(Year, Quarter) %>% mutate(Month_Num = rep(1:3, each = 2)) %>% ungroup() %>% # 转换为月份名称 mutate(Month = case_when( Month_Num == 1 ~ "January", Month_Num == 2 ~ "February", Month_Num == 3 ~ "March" # 注:如果需要对应季度的真实月份(如2nd Quarter对应4-6月),可修改case_when的匹配规则 )) %>% select(-Month_Num) %>% # 转换为宽格式(月份作为列) pivot_wider(names_from = Month, values_from = Government_Expenditure) monthly_data
关键调整说明
- 用
uncount(6)将每一行季度数据拆分为6行,确保后续生成的Month_Num长度与数据行数匹配; - 通过
group_by(Year, Quarter)为每个季度分组生成重复的月份编号,避免全局rep导致的长度不匹配问题; - 保留了你原本的月份名称转换和宽格式转换逻辑。
补充:如果需要对应季度的真实月份
如果你的需求是每个季度对应真实的3个月份(如1st Quarter对应1-3月,2nd对应4-6月等),可以修改代码如下:
monthly_data <- new_data %>% # 每个季度拆成3行,对应3个真实月份 uncount(3) %>% group_by(Year, Quarter) %>% # 为每个季度生成对应真实月份编号 mutate(Month_Num = case_when( Quarter == "1st Quarter" ~ 1:3, Quarter == "2nd Quarter" ~ 4:6, Quarter == "3rd Quarter" ~ 7:9, Quarter == "4th Quarter" ~ 10:12 )) %>% ungroup() %>% mutate(Month = month.name[Month_Num]) %>% select(-Month_Num) %>% pivot_wider(names_from = Month, values_from = Government_Expenditure)
内容的提问来源于stack exchange,提问作者talha asif
相关产品推荐
相关产品推荐

