将时间序列中的 NA 向后替换为有限数量的观测值
Backward replacement of NAs in time series only to a limited number of observations
在数据中 table 我想在 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)
但我不知道如何修改该代码以进行向后替换。我该如何解决这个问题?谢谢!
Hacky,但为什么不直接翻转您的专栏呢?
代码
# 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
在数据中 table 我想在 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)
但我不知道如何修改该代码以进行向后替换。我该如何解决这个问题?谢谢!
Hacky,但为什么不直接翻转您的专栏呢?
代码
# 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