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

时间:2011-09-06 09:19:50

标签: r dataframe interpolation

我尝试通过NA插值从我的数据框中删除na.approx(),但无法移除所有NA

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

这就是我在做的事情:

  • 使用hdf5load
  • 读取原始hdf文件
  • 子集数据框(4094x4096)
  • 用NA

    替换标志值
    > sst4[sst4 == 270.15 ] = NA
    
  • 检查第一列(或任何其他列)

    > summary(sst4[,1])
    
    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's
    271.3   276.4   285.9   285.5   292.3   302.8  1345.0
    
  • 运行na.approx

    > sst4=na.approx(sst4,na.rm="FALSE")
    
  • 检查第一栏

    > summary(sst4[,1]) 
    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's
    271.3   276.5   286.3   285.9   292.6   302.8   411.0
    

正如您所见,411 NA尚未删除。为什么?它们都对应于前导/结束列值吗?

head(sst4[,1])
[1] NA NA NA NA NA NA
tail(sst4[,1])
[1] NA NA NA NA NA NA

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

非常感谢

3 个答案:

答案 0 :(得分:13)

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

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

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

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


编辑:进一步思考。由于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

双向运行na.approx

by_col <- na.approx(m)
by_row <- t(na.approx(t(m)))

找出最好的猜测。

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
  )
)

答案 1 :(得分:10)

默认情况下,

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

同样,您可以明确地使用“最后一次观察结转”。

na.locf(na.approx(m))
## "first observation carry backwards" too:
na.locf(na.locf(na.approx(m)), fromLast = TRUE)

答案 2 :(得分:1)

我认为您应该尝试设置na.rm=TRUE

  

来自文档

     

na.rm逻辑。领导的NA应该被删除吗?

http://www.oga-lab.net/RGM2/func.php?rd_id=zoo:na.approx