尝试通过 'order' 函数对 R xts 对象进行排序
Trying to sort an R xts object via the 'order' function
有人可以帮助我理解为什么 'order' 函数没有按预期对 xts 数据框进行排序吗?正如您在下面看到的,排序函数似乎完成了它的工作,因为索引看起来是排序的。但是,当在 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
您不能更改动物园对象的顺序,并且由于 xts 对象是动物园对象,因此它也适用于 xts。动物园中的 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.
或者这将创建一个 zoo 对象,其时间顺序为 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
有人可以帮助我理解为什么 'order' 函数没有按预期对 xts 数据框进行排序吗?正如您在下面看到的,排序函数似乎完成了它的工作,因为索引看起来是排序的。但是,当在 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
您不能更改动物园对象的顺序,并且由于 xts 对象是动物园对象,因此它也适用于 xts。动物园中的 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.
或者这将创建一个 zoo 对象,其时间顺序为 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