假设我有一个不完整的数据框,其中包含日期(已经四舍五入),代表利率变化(如果缺少行则没有变化):
Date i
1 2015-03-01 30.0
2 2015-02-01 19.5
3 2014-11-01 14.0
4 2014-08-01 12.5
5 2014-04-01 9.5
6 2013-08-01 6.5
我想通过复制值来添加缺少的月份,如下所示:
Date i
1 2015-03-01 30.0
2 2015-02-01 19.5
3 2015-01-01 14.0
4 2014-12-01 14.0
5 2014-11-01 14.0
6 2014-10-01 12.5
当然,我可以将年份和月份分别作为数值提取并构建一个新的数据框(代码看起来会相当复杂)。但我相信必须有一些优雅的方式来做,也许通过以某种方式循环日期并为月份添加值?
答案 0 :(得分:1)
要采取两个步骤。首先,使用合并插入所有缺失的行
DF2 <- merge(
data.frame(Date = seq(from = tail(DF$Date,1), to = DF$Date[1], by = "month")),
DF,
all.x = TRUE)
然后填写缺失的值:
library(zoo)
DF2$i <- na.locf(DF2$i)
给出了
Date i
1 2013-08-01 6.5
2 2013-09-01 6.5
3 2013-10-01 6.5
4 2013-11-01 6.5
5 2013-12-01 6.5
6 2014-01-01 6.5
7 2014-02-01 6.5
8 2014-03-01 6.5
9 2014-04-01 9.5
10 2014-05-01 9.5
11 2014-06-01 9.5
12 2014-07-01 9.5
13 2014-08-01 12.5
14 2014-09-01 12.5
15 2014-10-01 12.5
16 2014-11-01 14.0
17 2014-12-01 14.0
18 2015-01-01 14.0
19 2015-02-01 19.5
20 2015-03-01 30.0
如果seq
列不属于Date
类,则上面的Date
命令将失败。在这种情况下,请先使用DF$Date <- as.Date(DF$Date)
。如果您希望订单倒退(从最近一个月开始,如在OP中),请使用DF2[ order(DF2$Date, decreasing = TRUE) ,]
。