r-输入缺失日期的缺失值

  • 本文关键字:日期 r date imputation
  • 更新时间 :
  • 英文 :


假设我有以下两个数据帧:

> sp
date value
1 2004-08-20     1
2 2004-08-23     2
3 2004-08-24     4
4 2004-08-25     5
5 2004-08-26    10
6 2004-08-27    11
> other
date value
1 2004-08-20     2
2 2004-08-23     4
3 2004-08-24     5
4 2004-08-25    10
5 2004-08-27    11

其中第一列表示日期,第二列表示每天的值。参考矩阵是sp,我想将关于sp的缺失日期和值估算到矩阵中。例如,在这种情况下,我错过了矩阵other中的日期"2004-08-26"。我应该在其他矩阵中添加一个新行,日期为"2004-08-26",值由"2004-08-25""2004-08-27"的值的平均值给出。

有人能建议我怎么做吗?

数据

sp <- data.frame(date=c("2004-08-20", "2004-08-23", "2004-08-24", "2004-08-25",
"2004-08-26", "2004-08-27"), value=c(1, 2, 4, 5, 10, 11))
other <- data.frame(date=c("2004-08-20", "2004-08-23", "2004-08-24", "2004-08-25",
"2004-08-27"), value=c(2, 4, 5, 10, 11))

使用zoo::na.approx:的选项

library(dplyr)
sp %>%
select(date) %>%
left_join(other, by = 'date') %>%
mutate(value = zoo::na.approx(value))
#        date value
#1 2004-08-20   2.0
#2 2004-08-23   4.0
#3 2004-08-24   5.0
#4 2004-08-25  10.0
#5 2004-08-26  10.5
#6 2004-08-27  11.0

如果我理解正确,您希望添加spother中缺少的日期。

您可以只使用spdate列来mergeother。注意,默认情况下,单列数据帧(和矩阵(的维度会被删除,因此我们需要drop=FALSE

所得到的NA可以例如使用approx进行线性插值,其给出期望的平均值。

other2 <- merge(other, sp[, 'date', drop=FALSE], all=TRUE) |>
transform(value=approx(value, xout=seq_along(value))$y)
other2
#         date value
# 1 2004-08-20   2.0
# 2 2004-08-23   4.0
# 3 2004-08-24   5.0
# 4 2004-08-25  10.0
# 5 2004-08-26  10.5  ## interpolated
# 6 2004-08-27  11.0

注意:对于R<4.1,do:

transform(merge(other, sp[, "date", drop = FALSE], all = TRUE), 
value = approx(value, xout = seq_along(value))$y)
#         date value
# 1 2004-08-20   2.0
# 2 2004-08-23   4.0
# 3 2004-08-24   5.0
# 4 2004-08-25  10.0
# 5 2004-08-26  10.5  ## interpolated
# 6 2004-08-27  11.0

相关内容

  • 没有找到相关文章

最新更新