我有一个缺少值的数据框(df),并希望通过限制来插入插值。我的数据框是:
X<-c(100,NA,NA,70,NA,NA,NA,NA,NA,NA,35)
Y<-c(10,NA,NA,40,NA,NA,NA,NA,NA,NA,5)
Z<-c(50,NA,NA,20,NA,NA,NA,NA,NA,NA,90)
df<-as.data.frame(cbind(X,Y,Z))
df
X Y Z
1 100 10 50
2 NA NA NA
3 NA NA NA
4 70 40 20
5 NA NA NA
6 NA NA NA
7 NA NA NA
8 NA NA NA
9 NA NA NA
10 NA NA NA
11 35 5 90
我能够通过已知值using的线性插值来估算缺失值:
data.frame(lapply(df, function(X) approxfun(seq_along(X), X)(seq_along(X))))
X Y Z
1 100 10 50
2 90 20 40
3 80 30 30
4 70 40 20
5 65 35 30
6 60 30 40
7 55 25 50
8 50 20 60
9 45 15 70
10 40 10 80
11 35 5 90
我的问题是如何将约束置于插值中?说NAs超过5个连续的条目应保留为NA并且不能被线性插值估算,以便我的新数据框看起来像:
X Y Z
1 100 10 50
2 90 20 40
3 80 30 30
4 70 40 20
5 NA NA NA
6 NA NA NA
7 NA NA NA
8 NA NA NA
9 NA NA NA
10 NA NA NA
11 35 5 90
答案 0 :(得分:3)
这里有一些有用的东西。它使用na.rm
标识NA
,rle
来标识NA
s的运行,然后cumsum
将这些运行转换为向量中的位置。< / p>
data.frame(lapply(df, function(X) {
af = approxfun(seq_along(X), X)
rl = rle(is.na(X))
cu = cumsum(rl$length)
L=5
unlist(sapply(1:length(cu), function(x) {
if (rl$values[x] & rl$length[x]>L) rep(NA, rl$lengths[x])
else af(seq(cu[x]-rl$lengths[x]+1,cu[x]))
}))
}))