R:循环和修改日期

时间:2015-10-09 12:46:46

标签: r

假设我有一个不完整的数据框,其中包含日期(已经四舍五入),代表利率变化(如果缺少行则没有变化):

        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

当然,我可以将年份和月份分别作为数值提取并构建一个新的数据框(代码看起来会相当复杂)。但我相信必须有一些优雅的方式来做,也许通过以某种方式循环日期并为月份添加值?

1 个答案:

答案 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) ,]