用另一个时间序列更新时间序列
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 的对象并不总是可以凭直觉预测的。
假设我有两个时间序列
(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 的对象并不总是可以凭直觉预测的。