0

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

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

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

ETC

我觉得index()and的某种组合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
4

3 回答 3

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
于 2011-09-19T15:49:40.947 回答
1

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

您可以使用fmt参数 to coredata.xts(如 中所述?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
于 2011-09-20T00:36:34.290 回答
0

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

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

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

然而,这不会是一个xts对象。

于 2011-09-19T15:56:19.223 回答