如何用已知观测值之间的线性插值代替NA?

Jak*_*uss 5 r

我有以下数据框,

df <- data.frame(id = c("a", "a", "a", "a", "b", "b", "b", "b"),
        time = 1:4, value = c(100, NA, NA, 550, 300, NA, NA, 900))
Run Code Online (Sandbox Code Playgroud)

有人可以通过将值列的差值随时间均匀划分来建议用df替换NA值的方法吗?在时间1,A是100,在时间4 A是550.如何在时间2和3中将NA更改为250和400?然后在2和3时B和500和700?

我可以编写一个复杂的for循环来强制它,但是有更高效的解决方案吗?

akr*_*run 11

你可以使用na.approxzoo

library(zoo)
df$value <- na.approx(df$value)
df
#  id time value
#1  a    1   100
#2  a    2   250
#3  a    3   400
#4  a    4   550
#5  b    1   300
#6  b    2   500
#7  b    3   700
#8  b    4   900
Run Code Online (Sandbox Code Playgroud)


Dav*_*urg 6

或者你可以创建自己的矢量化版本,na.approx没有任何复杂的循环,并解决它没有任何外部包

myna.approx <- function(x){
  len <- length(x) 
  cumsum(c(x[1L], rep((x[len] - x[1L])/(len - 1L), len - 1L)))
}

with(df, ave(value, id, FUN = myna.approx))
## [1] 100 250 400 550 300 500 700 900
Run Code Online (Sandbox Code Playgroud)

  • 那没关系,我也会用'na.approx`.我想要说明的是,在R中你应该尝试思考矢量化并且95%的日常任务可以在不编写单个循环的情况下得到解决 - 无论乍一看这项任务有多难. (2认同)