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%的日常任务都可以在不编写单个循环的情况下得到解决—无论任务乍看起来有多困难。