使用线性插值法将NA值插值到一个变量中

时间:2019-10-12 18:38:55

标签: r interpolation

尝试在数据框中插入NA值,并尝试使用zoo::na.approx,但这只会返回等距的值。

在给定数据框的情况下进行演示:

library(dplyr)
library(zoo) 
df <- data.frame(
      a = c(1,5 ,6 , 10),
      b = c(100, NA, NA, 1000)
)

尝试过:

df %>% 
  mutate(b = zoo::na.approx(b, rule = 2))

反而想要得到这个:

desired_df <- data.frame(
  a = c(1, 5 ,6 , 10),
  b = c(100, 500, 600, 1000)
)

是否有现成的函数可以执行此操作,或者必须使用线性插值公式来编写它:

enter image description here

3 个答案:

答案 0 :(得分:1)

lin_interp <- function(known, unknown) {
  # unknown object
  i1 <- !is.na(unknown)

  approx(x = known[i1], 
         y = unknown[i1], 
         xout = known)$y
}

提高代码可读性

输出是所需的:

df %>% 
  mutate(b = lin_interp(a, b))

答案 1 :(得分:1)

实际上,它在zoo中可用:

desired_df <- as.zoo(df, order.by = df$a) %>% 
  na.approx()

如您所见,您需要将数据框转换为zoo类。

答案 2 :(得分:0)

代码na.approx不起作用的原因是因为它通过检查类来分派方法。如果我们检查

library(zoo)
methods('na.approx')
#[1] na.approx.default na.approx.ts*     na.approx.zoo*    na.approx.zooreg*

方法na.approx.default是应用于OP数据的方法,因为它不是zoo对象。如果我们检查源代码,这些方法的行为会有所不同

na.approx.default

以及*函数

getAnywhere('na.approx.zoo')

因此,作为另一个答案,如果我们转换为适当的类,则生成的输出也将有所不同,因为分派的方法基于class