繁体   English   中英

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

[英]Interpolate NA values in one variable while using linear interpolant

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

为了演示,给定 dataframe:

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

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

在此处输入图像描述

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

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

提高代码可读性

output 如所愿:

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

实际上,它在zoo中可用:

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

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

代码na.approx不起作用的原因是它通过检查 class 来调度方法。 如果我们检查

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

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

na.approx.default

*函数

getAnywhere('na.approx.zoo')

因此,正如提到的另一个答案,如果我们转换为适当的 class,生成的 output 也会有所不同,因为调度的方法是基于class

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM