【问题标题】:How to return the date associated with each member of a sorted list in xts如何返回与xts中排序列表的每个成员关联的日期
【发布时间】:2011-09-19 14:24:21
【问题描述】:

我有一个 xts 对象“foo”,其中包含特定时期内股票价值的前 6 个最大负百分比变化。使用 sort(foo) 会生成一个按日期排序的列表,如下所示,但我想根据值对列表进行排序。

sort(coredata(foo)) 给了我我期望的列表,但返回的值没有关联的索引日期值,如下所示。我想要一份格式如下的列表:

2008-11-07 -0.150
2008-11-06 -0.145

我觉得index()which() 的某种组合可能会起作用,但无法产生任何有用的东西。任何指点都感激不尽。

sort(foo)

   [,1]
2008-10-08 -0.105
2008-10-16 -0.119
2008-10-27 -0.109
2008-11-06 -0.145
2008-11-07 -0.150
2008-12-12 -0.121

sort(coredata(foo))
[1] -0.150 -0.145 -0.121 -0.119 -0.109 -0.105

【问题讨论】:

    标签: r xts


    【解决方案1】:

    类似这样的东西会按照你想要的顺序给你日期:

     index(foo)[ order(coredata(foo)) ]
    

    xts 和 zoo 对象不喜欢乱序显示,所以我认为你需要将它们强制为一个不那么“有序”的类:

    > foo3 <- as.data.frame(foo)
    > foo3[order(foo3$V1), ]
    [1] -0.150 -0.145 -0.121 -0.119 -0.109 -0.105
    > foo3[order(foo3$V1), ,drop=FALSE]
                   V1
    2008-11-07 -0.150
    2008-11-06 -0.145
    2008-12-12 -0.121
    2008-10-16 -0.119
    2008-10-27 -0.109
    2008-10-08 -0.105
    

    【讨论】:

    • 感谢 James 和 DWin;我从两个答案中都学到了一些东西,对于像我这样的初学者来说,DWin 稍微容易掌握。我试图避免转换为数据框,但我想这不是什么大问题,因为性能不是问题。
    【解决方案2】:

    正如@DWin 指出的那样,索引必须是有序的(zoo 代表“Z 的有序对象”),因此您不能取消对 xts/zoo 对象的排序。

    您可以使用coredata.xtsfmt 参数(如?coredata.xts 中所述)结合drop 来获得一个命名向量,然后您可以按照您的需要进行排序。

    sort(drop(coredata(x,fmt=TRUE)))
    # 2008-11-07 2008-11-06 2008-12-12 2008-10-16 2008-10-27 2008-10-08 
    #     -0.150     -0.145     -0.121     -0.119     -0.109     -0.105
    

    【讨论】:

      【解决方案3】:

      我认为xtsprint 方法强加了日期排序,因此您不能仅通过子集来解决此问题:比较foo[1:2]foo[2:1]

      为了得到你想要的,你可以尝试,

      ord <- order(foo)
      dat <- data.frame(x=coredata(foo)[ord])
      rownames(dat) <- index(foo)[ord]
      

      然而,这将不是xts 对象。

      【讨论】:

        猜你喜欢
        • 2022-12-09
        • 2022-12-13
        • 2017-04-28
        • 2019-07-20
        • 2022-12-17
        • 2017-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多