首页 > 解决方案 > 尝试通过“order”函数对 R xts 对象进行排序

问题描述

有人可以帮助我理解为什么“订单”功能没有按预期对 xts 数据框进行排序吗?正如您在下面看到的,由于索引显示已排序,因此 order 函数似乎完成了它的工作。但是,当在 MSFT xts 对象内应用此索引向量时,将保持原始顺序,并且不会发生行顺序的更改。我错过了什么?我意识到应用 str(MSFT) 表明这些值属于“chr”类型,但我认为这无关紧要。

library(quantmod)
getSymbols("MSFT")

sorted_indices <- order(MSFT$MSFT.Adjusted)
sorted_indices
[1] 549 547 548 544 545 546

test <- MSFT[sorted_indices,]
head(test)
MSFT.Open MSFT.High MSFT.Low MSFT.Close MSFT.Volume
2007-01-03     29.91     30.25    29.40      29.86    76935100
2007-01-04     29.70     29.97    29.44      29.81    45774500
2007-01-05     29.63     29.75    29.45      29.64    44607200
2007-01-08     29.65     30.10    29.53      29.93    50220200
2007-01-09     30.00     30.18    29.73      29.96    44636600
2007-01-10     29.80     29.89    29.43      29.66    55017400
           MSFT.Adjusted
2007-01-03      21.96213
2007-01-04      21.92535
2007-01-05      21.80031
2007-01-08      22.01361
2007-01-09      22.03568
2007-01-10      21.81502

标签: rxtszoo

解决方案


您不能更改 zoo 对象的顺序,并且由于 xts 对象是 zoo 对象,因此它也适用于 xts。Zoo 中的 oo 代表有序观察。这样的对象总是按其时间索引的顺序存储和显示。

您可以像这样从 xts 对象以各种方式创建矩阵或数据框,在这种情况下,您可以执行这些对象允许的任何操作。

as.data.frame(MSFT) # data frame with times as row names
coredata(zoo(MSFT)) # matrix with times as row names
data.matrix(MSFT)   # matrix with times as row names
fortify.zoo(MSFT)   # data frame with times in column 1
coredata(MSFT)      # matrix.  No times.

或者这将创建一个动物园对象,其时间为 1, 2, 3, ... 按调整列的顺序。行名称将是关联的日期。

z <- zoo(MSFT, order(order(Ad(MSFT))))
View(coredata(z))

head(coredata(z))
##            MSFT.Open MSFT.High MSFT.Low MSFT.Close MSFT.Volume MSFT.Adjusted
## 2009-03-09     15.20     15.74    15.10      15.15    66479100      11.58155
## 2009-03-05     15.86     15.88    15.27      15.27    89708500      11.67328
## 2009-03-06     15.35     15.62    14.87      15.28    92821400      11.68093
## 2009-03-02     15.96     16.25    15.72      15.79    80602100      12.07080
## 2009-03-03     16.03     16.24    15.64      15.88    80476600      12.13960
## 2009-03-04     16.12     16.40    15.89      16.12    69285100      12.32307

推荐阅读