仅在R中的第一个和最后一个观测值之间插值数据

仅在R中的第一个和最后一个观测值之间插值数据,r,linear-interpolation,R,Linear Interpolation,我有点困在这里,需要一些帮助。 我试图在一个时间序列中插入一些缺失的数据,但我的许多案例(国家)只有很少的观察结果,而且往往不一致。因此,我试图在每个国家的第一次观察和最后一次观察之间进行插值。如果在一个我不想被插入的国家中,在最后一次观察后仍有一些NAs,我该怎么做 data <- data.frame(country = c(1, 1, 1, 1, 2, 2, 2, 3, 3, 3), time = c(1990, 1991, 1992, 1993, 1

我有点困在这里,需要一些帮助。 我试图在一个时间序列中插入一些缺失的数据,但我的许多案例(国家)只有很少的观察结果,而且往往不一致。因此,我试图在每个国家的第一次观察和最后一次观察之间进行插值。如果在一个我不想被插入的国家中,在最后一次观察后仍有一些NAs,我该怎么做

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))
数据%group\u by(国家)%%>%
变异(int=na_插值(值))

我希望1国1993年的价值保持不变。这可能很简单,但我不能把我的头围绕着它

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

编辑: 这是一个基本的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)
                )

尝试使用“zoo”软件包中的na.appro功能


希望这是您正在寻找的,这将使国家1中的NA保持为NA。

您好,您希望输入什么值。希望这会有所帮助。
data$value我希望对组2中缺失的值进行插值(在示例中,是its 6,与插值函数一样),但组1中缺失的值不会,因为它位于该组中的最后一个值之后(在本例中为7,在您的示例中为1)。谢谢,就是这样!谢谢,这有助于我更进一步@H.Stevens我刚刚注意到,您希望将国家1中1993年的值保留为
NA
。除了公认的答案外,我还添加了另一个解决方案,即基本的R版本
> 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
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
data %>% group_by(country) %>% mutate(int = na.approx(value, na.rm=FALSE))