我有以下数据框,
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.approx从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
Run Code Online (Sandbox Code Playgroud)
或者你可以创建自己的矢量化版本,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)