R中时间序列数据的条件插值

Conditional interpolation of time series data in R

我有 N/As 的时间序列数据。数据将以动画散点图结束

Week    X   Y
 1      1   105
 2      3   110
 3      5   N/A
 4      7   130
 8     15   160
12     23   180
16     30   N/A
20     37   200

为了流畅的动画,数据将通过计算得到,额外的values/rows。对于 X 值,这只是算术运算。目前没问题。

Week    X   Y
 1      1   105
        2
 2      3   110
        4
 3      5   N/A
        6
 4      7   130
        8
        9
       10
       11
       12
       13
       14
 8     15   160
       16
       17
       18
       19
       20
       21
       22
12     23   180
       24
       25
       26
       27
       28
       29
16     30   N/A
       31
       32
       33
       34
       35
       36
20     37   200

Y 值应该进行插值,并且有一个额外的要求,插值应该只出现在两个连续的值之间,而不是出现在它们之间有 N/A 的值之间。

Week    X   Value
 1      1   105
        2   interpolated value
 2      3   110
        4
 3      5   N/A
        6
 4      7   130
        8   interpolated value
        9   interpolated value
       10   interpolated value
       11   interpolated value
       12   interpolated value
       13   interpolated value
       14   interpolated value
 8     15   160
       16   interpolated value
       17   interpolated value
       18   interpolated value
       19   interpolated value
       20   interpolated value
       21   interpolated value
       22   interpolated value
12     23   180
       24
       25
       26
       27
       28
       29
16     30   N/A
       31
       32
       33
       34
       35
       36
20     37   200

我已经尝试过 approx,将 "original" N/A 转换为占位符值并尝试使用 na.approx 等 zoo 包,但不明白,表达这种 "conditional approximation" 或 "conditional gap filling" 的正确条件语句。欢迎任何提示,非常感谢。

提前致谢

用 Inf 替换 NA,进行插值,然后将无限值恢复为 NA。

library(zoo)

DF2 <- DF
DF2$Y[is.na(DF2$Y)] <- Inf

w <- merge(DF2, data.frame(Week = min(DF2$Week):max(DF2$Week)), by = 1, all.y = TRUE)
w$Value <- na.approx(w$Y)
w$Value[!is.finite(Value)] <- NA

给出以下内容,其中周已扩展到所有周,Y 使得原始 NA 显示为 Inf,插入的 NA 显示为 NA。值是插值 Y。

> w
   Week  X   Y Value
1     1  1 105 105.0
2     2  3 110 110.0
3     3  5 Inf    NA
4     4  7 130 130.0
5     5 NA  NA 137.5
6     6 NA  NA 145.0
7     7 NA  NA 152.5
8     8 15 160 160.0
9     9 NA  NA 165.0
10   10 NA  NA 170.0
11   11 NA  NA 175.0
12   12 23 180 180.0
13   13 NA  NA    NA
14   14 NA  NA    NA
15   15 NA  NA    NA
16   16 30 Inf    NA
17   17 NA  NA    NA
18   18 NA  NA    NA
19   19 NA  NA    NA
20   20 37 200 200.0

注:以可重现的形式输入DF

Lines <- "
Week    X   Y
 1      1   105
 2      3   110
 3      5   N/A
 4      7   130
 8     15   160
12     23   180
16     30   N/A
20     37   200"
DF <- read.table(text = Lines, header = TRUE, na.strings = "N/A")