假设我有以下两个数据帧:
> 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
如果我理解正确,您希望添加sp
中other
中缺少的日期。
您可以只使用sp
的date
列来merge
other
。注意,默认情况下,单列数据帧(和矩阵(的维度会被删除,因此我们需要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