【问题标题】:Interpolating data only between first and last observation in R仅在 R 中的第一次和最后一次观察之间插入数据
【发布时间】:2020-05-22 11:03:55
【问题描述】:

我有点卡在这里,需要一些帮助。 我试图在时间序列中插入一些缺失的数据,但我的很多案例(国家)只有很少的观察结果,而且往往不一致。所以我试图在每个国家的第一次观察和最后一次观察之间进行插值。如果在我不想被插值的国家/地区的最后一次观察后留下一些 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。它可能很简单,但我无法理解它。

【问题讨论】:

  • 您好,您想输入什么值。希望这会有所帮助。data$value &lt;- ifelse(is.na(data$value),1,data$value)
  • 我希望对第 2 组中的缺失值进行插值(在示例中为 6,就像插值函数一样),但第 1 组中的缺失值不是,因为它在最后一个值之后该组(在本例中为 7,在您的为 1)。

标签: r linear-interpolation


【解决方案1】:

也许您可以使用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 解决方案,它将在 1993 年在国家 1 中保留 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

【讨论】:

  • 谢谢,这对我有帮助!
  • @H.Stevens 我刚刚注意到您希望将国家 1 中 1993 年的值保留为 NA。除了接受的答案之外,我还添加了另一个解决方案,即基本 R 版本
【解决方案2】:

尝试使用“zoo”包中的 na.approx 函数。

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

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

【讨论】:

  • 谢谢,就是这样!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 2019-07-19
  • 2018-07-01
  • 2017-02-11
  • 1970-01-01
  • 2021-11-20
相关资源
最近更新 更多