【问题标题】:Backward replacement of NAs in time series only to a limited number of observations仅将时间序列中的 NA 向后替换为有限数量的观测值
【发布时间】:2019-04-13 08:26:12
【问题描述】:

在数据表中,我想在 3 天内双向执行前向和后向间隙填充程序。

# Example data:
library(data.table)
library(zoo)
dt <- data.table(Value = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, 0.1359223, NA, NA, NA, NA, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, NA))

> dt
           Value 
1:          NA  
2:          NA  
3:          NA  
4:          NA  
5:          NA  
6:          NA  
7:          NA  
8:          NA  
9:          NA  
10:  0.1359223  
11:         NA  
12:         NA  
13:         NA  
14:         NA  
15:  0.0000000  
16:  0.0000000  
17:  0.0000000  
18:  0.0000000  
19:  0.0000000  
20:         NA  

因此,我想创建两个新列,一个用于前向替换 NA,一个用于后向替换。

# desired output
         Value      forward    backward
1:         NA           NA        NA
2:         NA           NA        NA
3:         NA           NA        NA
4:         NA           NA        NA
5:         NA           NA        NA
6:         NA           NA        NA
7:         NA           NA     0.1359223
8:         NA           NA     0.1359223
9:         NA           NA     0.1359223
10: 0.1359223      0.1359223   0.1359223
11:        NA      0.1359223      NA
12:        NA      0.1359223   0.0000000
13:        NA      0.1359223   0.0000000
14:        NA           NA     0.0000000    
15: 0.0000000      0.0000000   0.0000000
16: 0.0000000      0.0000000   0.0000000
17: 0.0000000      0.0000000   0.0000000
18: 0.0000000      0.0000000   0.0000000
19: 0.0000000      0.0000000   0.0000000
20:        NA      0.0000000          NA

前向替换适用于以下代码:

dt$forward <- NA
r <- rle(is.na(dt$Value))
dt$forward <- na.locf(dt$Value, fromLast = F, na.rm = F)
is.na(dt$forward) <- sequence(r$lengths) > 3 & rep(r$values, r$lengths)

但我不知道如何修改该代码以进行向后替换。我怎样才能解决这个问题?谢谢!

【问题讨论】:

    标签: r data.table time-series na zoo


    【解决方案1】:

    哈克,但为什么不直接翻转你的专栏呢?

    代码

    # Using your result as basis
    dt$Value <- rev(dt$Value)                  
    dt$backward <- NA
    r <- rle(is.na(dt$Value))
    dt$backward <- na.locf(dt$Value, fromLast = F, na.rm = F)
    is.na(dt$backward) <- sequence(r$lengths) > 3 & rep(r$values, r$lengths)
    dt$Value <- rev(dt$Value)                 
    dt$backward <- rev(dt$backward)            
    

    结果

    > dt
            Value   forward  backward
     1:        NA        NA        NA
     2:        NA        NA        NA
     3:        NA        NA        NA
     4:        NA        NA        NA
     5:        NA        NA        NA
     6:        NA        NA        NA
     7:        NA        NA 0.1359223
     8:        NA        NA 0.1359223
     9:        NA        NA 0.1359223
    10: 0.1359223 0.1359223 0.1359223
    11:        NA 0.1359223        NA
    12:        NA 0.1359223 0.0000000
    13:        NA 0.1359223 0.0000000
    14:        NA        NA 0.0000000
    15: 0.0000000 0.0000000 0.0000000
    16: 0.0000000 0.0000000 0.0000000
    17: 0.0000000 0.0000000 0.0000000
    18: 0.0000000 0.0000000 0.0000000
    19: 0.0000000 0.0000000 0.0000000
    20:        NA 0.0000000        NA
    

    【讨论】:

      猜你喜欢
      • 2019-03-23
      • 2014-11-14
      • 1970-01-01
      • 2017-08-29
      • 2019-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多