将 NA 替换为 r 中特定列字段的内插值

Replace NA with interpolated value for specific column fields in r

我有一个时间序列数据,在几个特定的​​列字段中有 NA 值。尝试用内插值替换列字段中的 NA 时出现错误。下面是我尝试使用下面的错误消息执行的示例代码。第一行的值为 17.58(温度),下一个值仅位于第 30 行(2 分钟时间步长),值为 16.58。这种 NA 模式和数据可用性扩展到其余数据。

library(zoo)
my_data[, 42] <- na.approx(my_data[, 42])

错误 [<-.data.frame(*tmp*, , 42, value = c(17.58, 17.5466666666667, : 替换有 120726 行,数据有 132373

?na.approx

中指定

An object of similar structure as object with NAs replaced by interpolation. For na.approx only the internal NAs are replaced and leading or trailing NAs are omitted if na.rm = TRUE or not replaced if na.rm = FALSE.

默认情况下,na.approx 使用 na.rm = TRUE

na.approx(object, x = index(object), xout, ..., na.rm = TRUE, maxgap = Inf, along)


因此,我们可以将代码改为

my_data[, 42] <- na.approx(my_data[, 42], na.rm = FALSE)

在大型数据集中,可能有 leading/lagging 个 NA,使用 OP 的代码会导致输出向量的元素数量少于 na.rm = TRUE,这会触发长度差异错误替换

如果你需要线性插值,也许我们可以使用approxfun,例如

> y <- c(17.58, rep(NA, 28), 16.58)

> approxfun(which(!is.na(y)), na.omit(y))(seq_along(y))
 [1] 17.58000 17.54552 17.51103 17.47655 17.44207 17.40759 17.37310 17.33862
 [9] 17.30414 17.26966 17.23517 17.20069 17.16621 17.13172 17.09724 17.06276
[17] 17.02828 16.99379 16.95931 16.92483 16.89034 16.85586 16.82138 16.78690
[25] 16.75241 16.71793 16.68345 16.64897 16.61448 16.58000