我有一大组数据被安排为国家的一个轴和多年的数字,每100k的犯罪率观察。许多国家缺少观察结果,因此例如一个国家的犯罪率可能是(样本数据):
df <- c(NA, NA, 3, NA, 5, NA)
我可以使用以下代码进行插值:
df_interp <- data.frame(lapply(df,
function(x) na.approx(x, rule = 2)))
但后来我得到:3 3 3 4 5 5
我希望它成为:NA NA 3 4 5 NA
我不希望将值外推到边界,只在已知观察内插值。
答案 0 :(得分:0)
我们可以使用rle
来获取逻辑向量(lengths
)中相等元素的values
和!is.na(v1)
。将第一个和最后一个TRUE之间的逻辑向量values
的元素更改为TRUE以创建'ind',子集'v1'并在该向量上应用na.approx
。
library(zoo)
ind <- inverse.rle(within.list(rle(!is.na(v1)), {
i1 <- which(values)
values[min(i1):max(i1)] <- TRUE}))
v1[ind] <- na.approx(v1[ind], rule=2)
v1
#[1] NA NA 3 4 5 NA
或者我们可以找到包含which
的第一个和最后一个非NA元素的索引,获取序列(:
)并仅对这些元素使用na.approx
ind2 <- Reduce(`:`,range(which(!is.na(v1))))
v1[ind2] <- na.approx(v1[ind2], rule=2)
v1
#[1] NA NA 3 4 5 NA
v1 <- c(NA, NA, 3, NA, 5 , NA)