根据周围的非缺失值有条件地替换缺失值

Ziy*_* Xu 5 r vectorization missing-data na

我试图NA在向量中替换缺失值().NA两个相等数字之间的数字由该数字代替.NA应该留下两个不同的价值观NA.例如,给定矢量"a",我希望它是"b".

a = c(1, NA, NA, NA, 1, NA, NA, NA, 2, NA, NA, 2, 3, NA, NA, 3)
b = c(1, 1, 1, 1, 1, NA, NA, NA, 2, 2, 2, 2, 3, 3, 3, 3)
Run Code Online (Sandbox Code Playgroud)

如您所见,NA1和之间的第二次运行2不会被替换.

有没有办法对计算进行矢量化?

Hen*_*rik 2

您可以使用zoo包中的便利功能。在这里,我们替换NA原始向量,其中插值(由 产生na.approx)等于“最后的观察结转”(由 产生na.locf):

library(zoo)
a_ap <- na.approx(a)
a_locf <- na.locf(a)
a[which(a_ap == a_locf)] <- a_ap[which(a_ap == a_locf)]
a
# [1]  1  1  1  1  1 NA NA NA  2  2  2  2  3  3  3  3
Run Code Online (Sandbox Code Playgroud)

要考虑前导和尾随NA,请添加na.rm = FALSE

a <- c(NA, 1, NA, NA, NA, 1, NA, NA, NA, 2, NA, NA, 2, 3, NA, NA, 3, NA)

a_ap <- na.approx(a, na.rm = FALSE)
a_locf <- na.locf(a, na.rm = FALSE)
a[which(a_ap == a_locf)] <- a_ap[which(a_ap == a_locf)]
a
# [1] NA  1  1  1  1  1 NA NA NA  2  2  2  2  3  3  3  3 NA
Run Code Online (Sandbox Code Playgroud)