我有以下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
但结果并不是我所需要的。 我很感激任何建议。非常感谢你!
答案 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)