R使用以前的数据填充单元格

时间:2015-01-05 18:43:00

标签: r date loops replace

我有一张如下表格:

    days    Debit   loaddate    
1   23/01/2014  138470289.4 23/01/2014  
2   24/01/2014  NA  NA  
3   25/01/2014  NA  NA  
4   26/01/2014  NA  NA  
5   27/01/2014  NA  NA  

每天一行,然后在几个NA之后的列loaddate中出现另一个日期:

28  19/02/2014  NA  NA  
29  20/02/2014  NA  NA  
30  21/02/2014  NA  NA  
31  22/02/2014  9090967.9   22/02/2014  
32  23/02/2014  NA  NA  
33  24/02/2014  308083.5    24/02/2014  

我想将loaddate列中的每个NA替换为loaddate中的上一个日期。

我试过了:

for(i in 1:nrow(data3)) 
    { if (!is.na(data3[i,'Debit'])) 
          {data3[i,'loaddate1']<-as.Date(data3[i,'loaddate'], format='%Y-%m-%d')}
      else {data3[i,'loaddate1']<-data3[i-1,'loaddate1']}
}

但我的格式错误了:

> head(data3)
        days     Debit   loaddate loaddate1
1 2014-01-23 138470289 2014-01-23     16093
2 2014-01-24        NA       <NA>     16093
3 2014-01-25        NA       <NA>     16093
4 2014-01-26        NA       <NA>     16093
5 2014-01-27        NA       <NA>     16093
6 2014-01-28        NA       <NA>     16093

我还需要获取日期格式。如果我这样做:

for(i in 1:nrow(data3)) 
    { if (!is.na(data3[i,'Debit'])) 
          {data3[i,'loaddate1']<-as.Date(data3[i,'loaddate'], format='%Y-%m-%d')}
      else {data3[i,'loaddate1']<-as.Date(data3[i-1,'loaddate1'], format='%Y-%m-%d')}
}

我得到了错误的结果(使用NA)。

        days     Debit   loaddate loaddate1
1 2014-01-23 138470289 2014-01-23     16093
2 2014-01-24        NA       <NA>      <NA>
3 2014-01-25        NA       <NA>      <NA>
4 2014-01-26        NA       <NA>      <NA>
5 2014-01-27        NA       <NA>      <NA>
6 2014-01-28        NA       <NA>      <NA>

如何以正确的格式获得正确的结果? 此外,还有更好的方法来替换它吗?我的意思是没有循环。 感谢。

1 个答案:

答案 0 :(得分:4)

尝试zoo::na.locf并确保使用适当的日期格式:

library(zoo)
data3$loaddate <- as.Date(na.locf(data3$loaddate), format='%d/%m/%Y'))