使用其他时间序列更新时间序列

时间:2018-04-19 03:45:36

标签: r time-series xts

假设我有两个时间序列

(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(如果存在),但仅当x在特定日期没有值时才会回退到y ?例如,我希望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

2 个答案:

答案 0 :(得分:2)

这会解决你的问题吗?

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))

但你会留下重复的东西。由于我不知道你的回答是否真的要保留它们,我会给你选择。

希望有所帮助:)

答案 1 :(得分:2)

这是另一种解决方案,它不使用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(),因为它返回的对象并不总是直观可预测的。