R 如何用已知观测值之间的线性插值替换NAs?

R 如何用已知观测值之间的线性插值替换NAs?,r,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)) df您可以使用zoo library(zoo) df$value <- na.approx(df$value) df # id time value #1 a 1 100 #2 a 2

我有以下数据框

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

df您可以使用
zoo

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
图书馆(动物园)

df$value或者您可以创建自己的
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

myna.approw我接受了zoo解决方案,因为我认为,尽管我从你的答案中学到了更多,但一般来说,人们会寻找预先存在的功能。那很好,我也会使用
na.approw
。我想说明的是,在R中,您应该尝试将其矢量化,并且95%的日常任务都可以在不编写单个循环的情况下得到解决—无论任务乍看起来有多困难。