如何将 XTS 更改为 data.frame 并保留索引?
Posted
技术标签:
【中文标题】如何将 XTS 更改为 data.frame 并保留索引?【英文标题】:How can I change XTS to data.frame and keep Index? 【发布时间】:2011-03-24 03:29:03 【问题描述】:我有一个 R 格式的 XTS 时间序列,格式如下,我正在尝试在导出为 CSV 以在另一个程序中工作之前进行一些处理、子集和重新排列。
head(master_1)
S_1
2010-03-03 00:00:00 2.8520
2010-03-03 00:30:00 2.6945
2010-03-03 01:00:00 2.5685
2010-03-03 01:30:00 2.3800
2010-03-03 02:00:00 2.2225
2010-03-03 02:30:00 2.0650
和
str(master_1)
An ‘xts’ object from 2010-03-03 to 2010-05-25 08:30:00 containing:
Data: num [1:4000, 1] 2.85 2.69 2.57 2.38 2.22 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr "S_1"
Indexed by objects of class: [POSIXt,POSIXct] TZ:
Original class: 'zoo'
xts Attributes:
List of 1
$ dateFormat: chr "Date"
我想将其转换为 data.frame,以便我可以更轻松地对其进行操作,然后导出到另一个程序。但是,当我使用 test1 <- as.data.frame(master_1)
时,test1 确实有可见的索引(即日期和时间),
head(test1)
S_1
2010-03-03 00:00:00 2.8520
2010-03-03 00:30:00 2.6945
2010-03-03 01:00:00 2.5685
2010-03-03 01:30:00 2.3800
2010-03-03 02:00:00 2.2225
2010-03-03 02:30:00 2.0650
但是索引没有显示,
str(test1)
'data.frame': 4000 obs. of 1 variable:
$ S_1: num 2.85 2.69 2.57 2.38 2.22 ...
并且写入 csv write.csv(master_1, file="master_1.csv")
不包括时间或日期。为什么会这样,如何将数据/时间数据包含为一列,以便在其他 R 命令中使用并正确导出?
感谢您的帮助。
【问题讨论】:
【参考方案1】:这是因为日期是 data.frame 中的行名。您需要将它们设为单独的列。
试试这个:
data.frame(date=index(master_1), coredata(master_1))
【讨论】:
这是正确的。回答第二个问题:write.csv
不包括索引,因为索引是 xts 属性,而不是行名。请改用write.zoo
。
感谢 Shane 和 Joshua,他们帮助我了解了哪里出了问题。
data.frame(date=index(master_1), value=coredata(master_1)[,])
一次性重命名变量。
干杯,它对我有用。 library('magrittr'); master_1 %>% data.frame %>% data.frame(Date = rownames(.), .)
有时工作有时不工作。【参考方案2】:
这有点侧边栏,但 ggplot2
包中的 fortify(...)
函数会将各种对象转换为适用于ggplot(...)
的数据帧,包括xts
对象。
library(xts)
set.seed(1) # for reproducible example
master_1 <- xts(rnorm(10,mean=2,sd=0.1),as.POSIXct("2010-03-03")+30*(0:9))
library(ggplot2)
df <- fortify(master_1)
head(df)
# Index master_1
# 1 2010-03-03 00:00:00 1.937355
# 2 2010-03-03 00:00:30 2.018364
# 3 2010-03-03 00:01:00 1.916437
# 4 2010-03-03 00:01:30 2.159528
# 5 2010-03-03 00:02:00 2.032951
# 6 2010-03-03 00:02:30 1.917953
因此,如果您已经在使用gggplot
,这是一种简单的方法。请注意,索引进入名为Index
(大写“I”)的列中。
【讨论】:
感谢您的回答,我设法在 ggplot2 ***.com/questions/35215579/how-to-plot-xts-in-ggplot2 中绘制 xts【参考方案3】:由于1.9.6
您可以直接从/到xts
转换而不会丢失索引类。就这么简单:
as.data.table(master_1)
索引添加为结果data.table
中的第一列,它保留索引Date
或POSIXct
类。
【讨论】:
require(data.table)
是必需的。【参考方案4】:
您可以将 xts 对象转换为 data.frame,其中包含索引为名为“Index”的列,zoo::fortify.zoo()
。
您不需要 ggplot2,但如果您加载了 xts(或 zoo)和 ggplot2,这仍然可以工作。
例如:
library(xts)
data(sample_matrix)
x <- as.xts(sample_matrix, dateFormat = "Date")
my_df <- fortify.zoo(x)
head(my_df)
# Index Open High Low Close
# 1 2007-01-02 50.03978 50.11778 49.95041 50.11778
# 2 2007-01-03 50.23050 50.42188 50.23050 50.39767
# 3 2007-01-04 50.42096 50.42096 50.26414 50.33236
# 4 2007-01-05 50.37347 50.37347 50.22103 50.33459
# 5 2007-01-06 50.24433 50.24433 50.11121 50.18112
# 6 2007-01-07 50.13211 50.21561 49.99185 49.99185
str(my_df)
# 'data.frame': 180 obs. of 5 variables:
# $ Index: Date, format: "2007-01-02" "2007-01-03" ...
# $ Open : num 50 50.2 50.4 50.4 50.2 ...
# $ High : num 50.1 50.4 50.4 50.4 50.2 ...
# $ Low : num 50 50.2 50.3 50.2 50.1 ...
# $ Close: num 50.1 50.4 50.3 50.3 50.2 ...
【讨论】:
【参考方案5】:谢恩是对的。您可能正在寻找索引(您的 xts)。这是一个可重现的示例。
library(xts)
example(xts)
x = head(sample.xts)
datefield = index(x)
newdf = data.frame(x,datefield)
然后您应该能够简单地将其导出为 csv。当然,您也可以重命名行。
【讨论】:
感谢 ran2 的示例。如果 x 不是 XTS 对象,我也可以使用 rownames(x)。【参考方案6】:将 XTS 更改为 data.frame 的优雅表单:
myDF <- as.data.frame(as.matrix(myXTS))
【讨论】:
不需要as.matrix
,这不能回答问题:“写一个csv write.csv(master_1, file="master_1.csv")
不包括时间或日期。为什么会这样,我怎样才能包括数据/时间数据作为一列,所以在其他R命令中使用并正确导出?”以上是关于如何将 XTS 更改为 data.frame 并保留索引?的主要内容,如果未能解决你的问题,请参考以下文章