【问题标题】:Updating time series with another time series用另一个时间序列更新时间序列
【发布时间】:2018-04-19 03:45:36
【问题描述】:

假设我有两个时间序列

(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

【问题讨论】:

    标签: r time-series xts


    【解决方案1】:

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

    【讨论】:

    • 确实,使用ifelse() 需要进行一些测试,而且我在过去过于自信地使用它时遇到过一些惊喜。但是输出具有与测试相同的形状这一事实使其成为强大的矢量化函数。我同意有时输出的类可能是出乎意料的。无论如何,一如既往的好答案
    【解决方案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))
    

    但是你会留下重复的。由于我从您的回答中不知道您是否真的想保留它们,所以我会让您选择。

    希望有帮助:)

    【讨论】:

    • 关闭,从我上面的示例中不清楚,但在 x 和 y 在同一日期具有值的情况下,我只想要 y 的值。
    • 那么您可以随时使用ifelse 将自己带到您想要的位置,但它可能会变得不太可读.. 我会编辑我的答案
    猜你喜欢
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 2020-11-22
    • 2016-07-09
    相关资源
    最近更新 更多