如何在R中插值而不是外推到边界

时间:2016-02-27 05:23:23

标签: r interpolation

我有一大组数据被安排为国家的一个轴和多年的数字,每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

我不希望将值外推到边界,只在已知观察内插值。

1 个答案:

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