r语言 - 插补缺失的变量,但不插补在开头和结尾?



考虑以下工作示例:

library(data.table)
library(imputeTS)
DT <- data.table(
time = c(1:10),
var1 = c(1:5, NA, NA, 8:10),
var2 = c(NA, NA, 1:4, NA, 6, 7, 8),
var3 = c(1:6, rep(NA, 4))
)
time var1 var2 var3
1:    1    1   NA    1
2:    2    2   NA    2
3:    3    3    1    3
4:    4    4    2    4
5:    5    5    3    5
6:    6   NA    4    6
7:    7   NA   NA   NA
8:    8    8    6   NA
9:    9    9    7   NA
10:   10   10    8   NA

我想使用 imputeTS 包中的na_interpolation插补时间序列内不同点的缺失值。但是,我不想在序列的开头或结尾插补缺失值,这些值可以是不同长度的(在我的应用程序中替换这些值没有意义(。

当我运行以下代码来插补序列时,但是所有 NA 都会被替换:

DT[,(cols_to_impute_example) := lapply(.SD, na_interpolation), .SDcols = cols_to_impute_example]
> DT
time var1 var2 var3
1:    1    1    1    1
2:    2    2    1    2
3:    3    3    1    3
4:    4    4    2    4
5:    5    5    3    5
6:    6    6    4    6
7:    7    7    5    6
8:    8    8    6    6
9:    9    9    7    6
10:   10   10    8    6

我想要实现的是:

time var1 var2 var3
1:    1    1   NA    1
2:    2    2   NA    2
3:    3    3    1    3
4:    4    4    2    4
5:    5    5    3    5
6:    6    6    4    6
7:    7    7    5   NA
8:    8    8    6   NA
9:    9    9    7   NA
10:   10   10    8   NA

一个dplyr实现: 我们选择进行 NA 插值的 DF 中间部分,然后将其绑定回去。

library(imputeTS)
library(dplyr)
DT <- data_frame(
time = c(1:10),
var1 = c(1:5, NA, NA, 8:10),
var2 = c(NA, NA, 1:4, NA, 6, 7, 8),
var3 = c(1:6, rep(NA, 4))
)
na_inter_middle<-function(row_start, row_end){
# extracts the first part of the df where no NA need to be replaced
DT[1:row_start,]->start 
# middle part, interpolating NA values
DT[(row_start + 1):(nrow(DT) - row_end),]->middle
#end part
DT[(nrow(DT) - (row_end - 1) ):nrow(DT),]->end

start %>% 
bind_rows(
middle %>% 
mutate_all(na.interpolation)
) %>% 
bind_rows(end)
}
na_inter_middle(2,3)  

# A tibble: 10 x 4
time  var1  var2  var3
<int> <dbl> <dbl> <dbl>
1     1     1    NA     1
2     2     2    NA     2
3     3     3     1     3
4     4     4     2     4
5     5     5     3     5
6     6     5     4     6
7     7     5     4     6
8     8     8     6    NA
9     9     9     7    NA
10    10    10     8    NA

也许不是那么出名,您还可以在imputeTSna.interpolation函数中使用 approx 中的其他参数。

这个问题可以通过以下方式解决:

library(imputeTS)
DT[,(2:4) := lapply(.SD, na_interpolation, yleft = NA , yright = NA), .SDcols = 2:4]

在这里,您可以使用yleftyright指定如何处理尾随/前导 NA。

这导致所需的输出:

time var1 var2 var3
1:    1    1   NA    1
2:    2    2   NA    2
3:    3    3    1    3
4:    4    4    2    4
5:    5    5    3    5
6:    6    6    4    6
7:    7    7    5   NA
8:    8    8    6   NA
9:    9    9    7   NA
10:   10   10    8   NA

基本上,您在approx函数描述中找到的几乎所有参数也可以作为微调的附加参数提供给 na.interpolation 函数。

Library zoo 提供了一个插值函数,允许更多自定义:

library(zoo)
DT[,(2:4) := lapply(.SD, na.approx, x = time, na.rm = FALSE), .SDcols = 2:4]

相关内容

  • 没有找到相关文章

最新更新