仅在 R 中的第一次和最后一次观察之间插入数据

Interpolating data only between first and last observation in R

我有点卡在这里,需要一些帮助。 我试图在时间序列中插入一些缺失的数据,但我的很多案例(国家)只有很少的观察结果,而且往往不一致。所以我试图在每个国家的第一次观察和最后一次观察之间进行插值。如果在我不想插入的国家/地区的最后一次观察后留下一些 NA,我该怎么做?

library("tidyverse")
library("imputeTS")
data <- data.frame(country = c(1, 1, 1, 1, 2, 2, 2, 3, 3, 3), 
               time = c(1990, 1991, 1992, 1993, 1990, 1991, 1992, 1990, 1991, 1992), 
               value = c(5, 6, 7, NA, 5, NA, 7, 5, 6, 7))
print(data)


data %>% group_by(country) %>% 
 mutate(int = na_interpolation(value))

我希望国家 1 中 1993 年的值保持为 NA。它可能很简单,但我无法理解它。

也许您可以使用 lm + predict 尝试以下代码(将预测所有 NA

m <- lm(value ~ time + country, data)
data$value[is.na(data$value)] <- predict(m, newdata = subset(data,!!rowSums(is.na(data))))

这样

> data
   country time value
1        1 1990     5
2        1 1991     6
3        1 1992     7
4        1 1993     8
5        2 1990     5
6        2 1991     6
7        2 1992     7
8        3 1990     5
9        3 1991     6
10       3 1992     7

编辑: 这是一个基本的 R 解决方案,它将在国家 1

中保留 1993 年的 NA
data <- do.call(rbind,
                c(lapply(split(data,data$country), 
                         function(v) within(v, value <- approx(time[!is.na(value)],value[!is.na(value)],time)$y)),
                  make.row.names = F)
                )

这样

> data 
   country time value
1        1 1990     5
2        1 1991     6
3        1 1992     7
4        1 1993    NA
5        2 1990     5
6        2 1991     6
7        2 1992     7
8        3 1990     5
9        3 1991     6
10       3 1992     7

尝试使用“zoo”包中的na.approx功能。

library("zoo")
data %>% group_by(country) %>% mutate(int = na.approx(value, na.rm=FALSE))

希望这就是您要找的,这将使国家/地区 1 中的 NA 保持为 NA。