用另一个时间序列更新时间序列

Updating time series with another time series

假设我有两个时间序列

(x <- xts(c(5,4:10), Sys.Date()+3:10))
(y <- xts(1:6, Sys.Date()+1:6))

merge(x,y)

            x  y
2018-04-20 NA  1
2018-04-21 NA  2
2018-04-22  5  3
2018-04-23  4  4
2018-04-24  5  5
2018-04-25  6  6
2018-04-26  7 NA
2018-04-27  8 NA
2018-04-28  9 NA
2018-04-29 10 NA

如何获得一个时间序列,该时间序列如果存在则采用 y 的值,但仅当 y 没有值时才返回到 x具体日期?例如,我想要 z 中的值如下:

            x  y z
2018-04-20 NA  1 1
2018-04-21 NA  2 2 
2018-04-22  5  3 3 
2018-04-23  4  4 4 
2018-04-24  5  5 5
2018-04-25  6  6 6
2018-04-26  7 NA 7 
2018-04-27  8 NA 8 
2018-04-28  9 NA 9
2018-04-29 10 NA 10

这会解决您的问题吗?

z <- rbind(x,y)
z <- z[!duplicated(z)]

编辑

请注意,rbind() 按优先顺序按行绑定 xts 个对象,即 y 的行将在 x 的行之前,因为 y 在函数调用

中放在 x 之前
> rbind(y, x) 
           [,1] 
2018-04-21    1 
2018-04-22    2 
2018-04-23    3 
2018-04-23    5 
2018-04-24    4 
2018-04-24    4 
2018-04-25    5 
2018-04-25    5 
2018-04-26    6 
2018-04-26    6 
2018-04-27    7 
2018-04-28    8 
2018-04-29    9 
2018-04-30   10 

然后我发现z[!duplicated(z)]实际上是不正确的。您要删除的重复项是索引中的重复项,因此请尝试一下。

z <- rbind(y, x) 
z <- z[!duplicated(index(z))] 

我是 xts 的狂热用户,我总是尝试使用它的功能,因为它们通常以非常易读和自然的方式为您完成所有工作。但是当我找不到出路时,我经常使用强大的ifelse(),效率王子和歧义破坏者。

z <- merge(x, y) 
zz <- ifelse(is.na(z[, 2]), z[, 1], z[, 2])

现在 zz 不再是 xts 对象所以必须做

zz <- xts(zz, index(z))

但是你会留下重复的。由于我无法从你的回答中得知你是否真的想要保留它们,所以我将让你选择。

希望对您有所帮助:)

这是另一个解决方案,它不使用 ifelse()

# Merge the two objects first
z <- merge(x,y)

# Create a new column from a copy of 'y'
z$z <- z$y

# Missing values in column 'z'
zNA <- is.na(z$z)

# Fill all missing values in column 'z' with values from column 'x'
z[zNA, "z"] <- z[zNA, "x"]

我个人避免使用 ifelse() 因为它 returns 的对象并不总是可以凭直觉预测的。