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