如何在R中扩展日历周期以补全dataframe?
问题描述
现有数据框testDF,其中ID为1的条目包含5个周期(Period_1代表月份数),ID为50和60的条目各有3个周期。已通过tidyr包完成Period_1的补全,让所有ID都拥有5个Period_1,同时向下填充了Bal和State字段。现在需要以相同逻辑扩展表示日历月份的Period_2,同时要处理跨年度滚动的场景。
初始实现代码
library(tidyr) testDF <- data.frame( ID = as.numeric(c(rep(1,5),rep(50,3),rep(60,3))), Period_1 = as.numeric(c(1:5,1:3,1:3)), Period_2 = c("2012-06","2012-07","2012-08","2012-09","2012-10","2013-06","2013-07","2013-08","2012-01","2012-02","2012-03"), Bal = as.numeric(c(rep(10,5),21:23,36:34)), State = c("XX","AA","BB","CC","XX","AA","BB","CC","SS","XX","AA") ) testDFextend <- testDF %>% tidyr::complete(ID, nesting(Period_1)) %>% tidyr::fill(Bal, State, .direction = "down") testDFextend
编辑:处理跨年度滚动场景
为了验证Period_2扩展时的跨年度滚动逻辑,调整Period_2的示例数据,并在原有代码基础上补充跨年度日期生成的逻辑:
改进后完整代码
library(tidyr) library(dplyr) testDF <- data.frame( ID = as.numeric(c(rep(1,5),rep(50,3),rep(60,3))), Period_1 = as.numeric(c(1:5,1:3,1:3)), Period_2 = c("2012-06","2012-07","2012-08","2012-09","2012-10","2013-06","2013-07","2013-08","2012-10","2012-11","2012-12"), Bal = as.numeric(c(rep(10,5),21:23,36:34)), State = c("XX","AA","BB","CC","XX","AA","BB","CC","SS","XX","AA") ) testDFextend <- testDF %>% tidyr::complete(ID, nesting(Period_1)) %>% tidyr::fill(Bal, State, .direction = "down") testDFextend %>% separate(Period_2, into = c("year", "month"), convert = TRUE) %>% fill(year) %>% group_by(ID) %>% mutate(month = sprintf("%02d", zoo::na.spline(month))) %>% unite("Period_2", year, month, sep = "-") %>% # 补充跨年度处理逻辑 separate(Period_2, into = c("year", "month"), convert = TRUE) %>% mutate(month = as.integer(sprintf("%02d", zoo::na.spline(month)))) %>% mutate(year1 = ifelse(month > 12, year+trunc(month/12), year)) %>% mutate(month1 = ifelse(month > 12 & month%%12!= 0, month%%12, month)) %>% mutate(month1 = ifelse(month1 < 10, paste0(0,month1),month1)) %>% unite("Period_2", year1, month1, sep = "-") %>% select("ID","Period_1","Period_2","Bal","State")
内容的提问来源于Stack Exchange,提问作者Village.Idyot
相关产品推荐
相关产品推荐

