通过R中的不同变量添加缺少的end_of_months值

时间:2018-02-05 13:30:31

标签: r rstudio

我有以下xlsx文件df.xlsx looks like this

client id    dax           dpd 
1            2000-05-30    7
1            2000-12-31    6
2            2003-05-21    6 
3            1999-12-30    5
3            2000-10-30    6
3            2001-12-30    5
4            1999-12-30    5
4            2002-05-30    6

这是关于从快照到另一个快照的贷款迁移。问题是我之间的所有月份都没有。 (即:client_id = 1,dax是2000-05-30和2000-12-30)。我尝试了几种方法但没有结果。我需要在dax之间的所有月份填充client_id并保持与第一个月相同的“dpd”。 (即client_id = 1,dax为2000-05-30和2000-12-30,dpd = 7为所有月份,除了最后一个“2000-12-31”,其中dpd = 6)。如果client_id只出现一次(如client_id = 2),它应该保持不变。 (dpd表示过期天数,也就是评级桶) 我试过这段代码:

df2 <- data.frame(dax=seq(min(df$dax), max(df$dax), by="month"))

df3 <- merge(x=df2a, y=df, by="dax", all.x=T)
idx <- which(is.na(df3$values))
for (client_id in idx) 
  df3$values[client_id] <- df3$values[client_id-1]
df3

但结果并不是我所需要的。 我很感激任何建议。非常感谢你!

1 个答案:

答案 0 :(得分:0)

如果我理解你的问题,你想在给定开始/结束日期的情况下生成日期的序列。

执行此操作的R代码将是(从数据框中插入值):

seq(as.Date("2017-01-30"), as.Date("2017-12-30"), "month")

评论后编辑:

在这种情况下,您可以先按客户端拆分数据,然后生成序列:

new_data <- data.frame()
customerslist <- split(YOURDATA, YOURDATA$id)
for(i in 1:length(customerslist)){
  dates <- seq(min(as.Date(customerslist[[i]]$dax)), max(as.Date(customerslist[[i]]$dax)), "month")
  id <- rep(customerslist[[i]]$id[1], length(dates))
  dpd <- rep(customerslist[[i]]$dpd[1], length(dates))
  add <- cbind(id, as.character(dates), dpd)
  new_data <- rbind(new_data, add)
}
new_data$V2 <- as.Date(new_data$V2)