【问题标题】:R Fill cells with previous dataR 用以前的数据填充单元格
【发布时间】:2015-03-03 08:40:44
【问题描述】:

我有一张如下表:

    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>

我怎样才能得到正确的结果和正确的格式? 另外,有没有更好的方法来做这个替换?我的意思是没有循环。 谢谢。

【问题讨论】:

  • 所以第 32 行应该是 22/02/2014?
  • 是的,第 32 行应该是 22/02/2014
  • library(zoo)尝试na.locf(df$loaddate)
  • 第一行总是有日期吗?
  • 是的。第一行总是一个日期

标签: r date loops replace


【解决方案1】:

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

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

【讨论】:

  • 我也一样。它没有填满 NA
  • str(data3$loaddate) Date[1:348], format: "2014-01-23" NA NA NA NA NA NA NA NA NA NA NA ... 警告信息:在 as。 POSIXlt.Date(x) : 强制引入的 NAs
  • 如果您的数据在运行我建议的之前是这样的,那么您应该运行data3$loaddate &lt;- na.locf(data3$loaddate)。我有点困惑为什么你的例子显示日期像22/02/2014
  • 你有没有弄清楚,如果没有,你能澄清差异吗?
猜你喜欢
  • 1970-01-01
  • 2020-10-21
  • 2015-06-04
  • 2020-12-01
  • 2019-08-09
  • 2011-11-08
  • 2021-08-22
  • 2017-08-16
  • 2017-10-07
相关资源
最近更新 更多