【问题标题】:converting zoo to dataframe将动物园转换为数据框
【发布时间】:2017-02-28 11:29:05
【问题描述】:

我将zoo time series 转换为R 中的数据框,日期成为数据框的索引。有没有办法将日期表示为数据框中的普通列?

monthly_df <- data.frame(monthly_zoo)

head(monthly_zoo)

head(monthly_df)

【问题讨论】:

  • monthly_df$month &lt;- rownames(monthly_df) 或使用tibble::rownames_to_column
  • edit您的帖子并将实际代码/输入/输出显示为文本而不是屏幕截图。其他人无法从您的图像中复制和粘贴。 See here 了解详情。谢谢。

标签: r time dataframe zoo


【解决方案1】:

你想要as.data.frame()。证人:

R> library(quantmod)
Loading required package: xts
Loading required package: TTR
Version 0.4-0 included new data defaults. See ?getSymbols.
R> IBM <- as.zoo(getSymbols("IBM"))  # convert from xts
R> class(IBM)
[1] "zoo"
R> tail(IBM)
           IBM.Open IBM.High IBM.Low IBM.Close IBM.Volume IBM.Adjusted
2016-10-11   156.73   156.95  153.89    154.79    2901300       154.79
2016-10-12   154.97   154.97  153.08    154.29    2964000       154.29
2016-10-13   153.70   154.22  152.27    153.72    2909900       153.72
2016-10-14   154.47   155.53  154.09    154.45    4358200       154.45
2016-10-17   154.45   155.89  154.34    154.77    5890400       154.77
2016-10-18   150.02   151.00  147.79    150.72   12705700       150.72
R> as.data.frame(tail(IBM))
           IBM.Open IBM.High IBM.Low IBM.Close IBM.Volume IBM.Adjusted
2016-10-11   156.73   156.95  153.89    154.79    2901300       154.79
2016-10-12   154.97   154.97  153.08    154.29    2964000       154.29
2016-10-13   153.70   154.22  152.27    153.72    2909900       153.72
2016-10-14   154.47   155.53  154.09    154.45    4358200       154.45
2016-10-17   154.45   155.89  154.34    154.77    5890400       154.77
2016-10-18   150.02   151.00  147.79    150.72   12705700       150.72
R> class(as.data.frame(tail(IBM)))
[1] "data.frame"
R> 

要将日期添加为列(而不是依赖默认的行名),请使其明确:

R> IBM <- getSymbols("IBM")  # keep as xts
R> tail(data.frame(index(IBM), as.data.frame(IBM)))
           index.IBM. IBM.Open IBM.High IBM.Low IBM.Close IBM.Volume IBM.Adjusted
2016-10-11 2016-10-11   156.73   156.95  153.89    154.79    2901300       154.79
2016-10-12 2016-10-12   154.97   154.97  153.08    154.29    2964000       154.29
2016-10-13 2016-10-13   153.70   154.22  152.27    153.72    2909900       153.72
2016-10-14 2016-10-14   154.47   155.53  154.09    154.45    4358200       154.45
2016-10-17 2016-10-17   154.45   155.89  154.34    154.77    5890400       154.77
2016-10-18 2016-10-18   150.02   151.00  147.79    150.72   12705700       150.72
R> 

【讨论】:

  • 我可能会误解,但这不仍然只是将index 保留为row.names 而不是“正确”列吗?
  • 这看起来更干净:cbind( index(IBM), data.frame(IBM)) 我已经学会不信任as.data.frame
【解决方案2】:

fortify.zoo(z) 将 zoo 对象 z 转换为第一列等于索引的 data.frame。

library(zoo)
z <- zoo(1:3, as.Date("2000-01-01") + 0:2) # test object
fortify.zoo(z)

给予:

       Index z
1 2000-01-01 1
2 2000-01-02 2
3 2000-01-03 3

如果 ggplot2 已加载(因此存在 fortify 泛型),那么它也可以写成:

library(ggplot2)
fortify(z)

【讨论】:

    猜你喜欢
    • 2014-07-22
    • 1970-01-01
    • 2014-01-19
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 2021-11-02
    • 2021-03-05
    相关资源
    最近更新 更多