使用na.approx插入数据框中的NA值

pac*_*met 21 interpolation r dataframe

我试图NA通过插值从我的数据框中删除s na.approx()但不能删除所有NAs.

我的数据帧是4096x4096,其中270.15是无效值的标志.我需要数据在所有点上连续不断地为气象模型提供信息.昨天我询问并获得了关于如何替换基于另一个数据帧的数据帧中的值的答案.但之后我来了na.approx()然后决定用270.15值替换NA并尝试na.approx()插入数据.但问题是为什么na.approx()不替换所有的NA.

这就是我在做的事情:

正如你所看到的那样,411 NA尚未被删除.为什么?它们都对应于前导/结束列值吗?

head(sst4[,1])
[1] NA NA NA NA NA NA
tail(sst4[,1])
[1] NA NA NA NA NA NA
Run Code Online (Sandbox Code Playgroud)

na.approx是否需要在NA之前和之后插入有效值?我是否需要设置任何其他na.approx选项?

非常感谢你

Ric*_*ton 14

一个小的,可重复的例子:

library(zoo)
set.seed(1)
m <- matrix(runif(16, 0, 100), nrow = 4)
missing_values <- sample(16, 7)
m[missing_values] <- NA
m
         [,1]     [,2]      [,3]     [,4]
[1,] 26.55087 20.16819 62.911404 68.70228
[2,] 37.21239       NA  6.178627 38.41037
[3,]       NA       NA        NA       NA
[4,] 90.82078 66.07978        NA       NA

na.approx(m)
         [,1]     [,2]      [,3]     [,4]
[1,] 26.55087 20.16819 62.911404 68.70228
[2,] 37.21239 35.47206  6.178627 38.41037
[3,] 64.01658 50.77592        NA       NA
[4,] 90.82078 66.07978        NA       NA

m[4, 4] <- 50
na.approx(m)
         [,1]     [,2]      [,3]     [,4]
[1,] 26.55087 20.16819 62.911404 68.70228
[2,] 37.21239 35.47206  6.178627 38.41037
[3,] 64.01658 50.77592        NA 44.20519
[4,] 90.82078 66.07978        NA 50.00000
Run Code Online (Sandbox Code Playgroud)

是的,看起来你需要知道列的开始/结束值或者插值不起作用.你能猜出你边界的价值吗?

另一个编辑:因此,默认情况下,您需要知道列的起始值和结束值.然而,na.approx通过传球可以始终填补空白rule = 2.见菲利克斯的回答.na.fill根据Gabor的评论,您还可以使用提供默认值.最后,您可以在两个方向上插入边界条件(见下文)或猜测边界条件.


编辑:进一步的想法.由于na.approx只是在列中进行插值,并且您的数据是空间的,因此也许在行中插值也很有用.然后你可以取平均值.

na.approx当整列都失败时NA,我们创建一个更大的数据集.

set.seed(1)
m <- matrix(runif(64, 0, 100), nrow = 8)
missing_values <- sample(64, 15)
m[missing_values] <- NA
Run Code Online (Sandbox Code Playgroud)

na.approx两种方式运行.

by_col <- na.approx(m)
by_row <- t(na.approx(t(m)))
Run Code Online (Sandbox Code Playgroud)

找出最好的猜测.

default <- 50
best_guess <- ifelse(is.na(by_row), 
  ifelse(
    is.na(by_col), 
    default,              #neither known
    by_col                #only by_col known
  ), 
  ifelse(
    is.na(by_col), 
    by_row,               #only by_row known
    (by_row + by_col) / 2 #both known
  )
)
Run Code Online (Sandbox Code Playgroud)


小智 11

na.approx()approx()默认情况下,仅在内插值时跟随函数,而不是外推它们.但是,如帮助页面中所述approx(),您可以指定rule = 2外推为最近极值的常量值.继Richie Cotton的例子之后:

na.approx(m, rule = 2)
         [,1]     [,2]      [,3]     [,4]
[1,] 26.55087 20.16819 62.911404 68.70228
[2,] 37.21239 35.47206  6.178627 38.41037
[3,] 64.01658 50.77592  6.178627 38.41037
[4,] 90.82078 66.07978  6.178627 38.41037
Run Code Online (Sandbox Code Playgroud)

同样,您可以明确地使用"最后观察结转".

na.locf(na.approx(m))
## "first observation carry backwards" too:
na.locf(na.locf(na.approx(m)), fromLast = TRUE)
Run Code Online (Sandbox Code Playgroud)

  • na.approx(... rule = 2)在联机帮助页上完全没有记录!它埋在70页的PDF文档中。 (2认同)