使用R插值多个NA值

5

我希望能够插值矩阵中的多个NA值,该矩阵名为 tester。

这是 tester 的一部分,只有 1 列包含 NA 值,在整个 744x6 矩阵中,其他列也有多个 NA 值:

ZONEID   TIMESTAMP         U10            V10            U100          V100
1        20121022 12:00    -1.324032e+00  -2.017107e+00 -3.278166e+00  -5.880225574
1        20121022 13:00    -1.295168e+00            NA  -3.130429e+00  -6.414975148
1        20121022 14:00    -1.285004e+00            NA  -3.068829e+00  -7.101699541
1        20121022 15:00    -9.605904e-01            NA  -2.332645e+00  -7.478168285
1        20121022 16:00    -6.268261e-01 -3.057278e+00  -1.440209e+00  -8.026791079

我已经安装了zoo包,并使用代码library(zoo)。我尝试使用na.approx函数,但它只能线性返回:

na.approx(tester)
# Error ----> need at least two non-NA values to interpolate

na.approx(tester, rule = 2)
# Error ----> need at least two non-NA values to interpolate

na.approx(tester, x = index(tester), na.rm = TRUE, maxgap = Inf)

之后我尝试了:

Lines <- "tester"
library(zoo) 
z <- read.zoo(textConnection(Lines), index = 2)[,2] 
na.approx(z)

我又遇到了相同的多个NA值错误。我也尝试过:

z <- zoo(tester)
index(Cz) <- Cz[,1]
Cz_approx <- na.approx(Cz)

同样的错误。
我一定做了些非常愚蠢的事情,但我真的很感激你的帮助。

两个值可以形成回归线,并允许插值。数学上确定,使用少于2个真实值的外推是不可能的。你最好使用随机数生成器。检查一下你的矩阵中是否有一个变量只包含NA值。请查看https://dev59.com/eG025IYBdhLWcg3whGSx,了解如何向我们提供可用的代码和测试对象。欢迎来到SO! - Joris Meys
嗨Joris,非常感谢你的帮助。你绝对是正确的,线性插值在数学上是没有合理性的。但我不确定随机数生成器如何帮助我的问题。我该如何编写代码,使每个多重NA值都位于前一个和下一个数字之间,或者至少等于前一个或下一个数字。在V10变量的情况下,介于-2.017和-3.057之间。你能帮我吗?非常感谢。还要感谢您的编辑,希望我没有犯太大错误,并会阅读您的建议以备将来之需。 - Tjeerd Luykx
Amelia? - Roland
我曾经遇到过同样的问题,因此我相信未来的读者也可能会看到这篇文章。我猜问题在于当你将包含日期类对象的数据框转换为zoo对象时,它被合并到了你的zoo对象中,因此当na.approx尝试用非数字值进行插值时会出现问题。肯定有更好的方法来解决这个问题,但我认为可以在调用zoo()函数时指定order.by参数以匹配你的日期类对象,并删除原始数据框中的任何非数字列或指定数字列。 - dudu
换句话说,避免在你的动物园对象中使用日期类对象。 - dudu
1个回答

9

您只能在至少有两个非NA值的列上应用na.approx。在这里,我使用布尔矩阵上的colSums来查找相关列。

# create a small matrix
m <- matrix(data = c(NA, 1, 1, 1, 1,
                     NA, NA, 2, NA, NA,
                     NA, NA, NA, NA, 2,
                     NA, NA, NA, 2, 3),
            ncol = 5, byrow = TRUE)

m
#      [,1] [,2] [,3] [,4] [,5]
# [1,]   NA    1    1    1    1
# [2,]   NA   NA    2   NA   NA
# [3,]   NA   NA   NA   NA    2
# [4,]   NA   NA   NA    2    3

library(zoo)

# na.approx on the entire matrix does not work
na.approx(m)
# Error in approx(x[!na], y[!na], xout, ...) : 
#   need at least two non-NA values to interpolate

# find columns with at least two non-NA values
idx <- colSums(!is.na(m)) > 1
idx
# [1] FALSE FALSE  TRUE  TRUE  TRUE

# interpolate 'TRUE columns' only
m[ , idx] <- na.approx(m[ , idx])
m
#      [,1] [,2] [,3]     [,4] [,5]
# [1,]   NA    1    1 1.000000  1.0
# [2,]   NA   NA    2 1.333333  1.5
# [3,]   NA   NA   NA 1.666667  2.0
# [4,]   NA   NA   NA 2.000000  3.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接