假设我有两个时间序列
(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
答案 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()
,因为它返回的对象并不总是直观可预测的。