将XTS转换为小标题的最佳方法是什么

时间:2019-02-26 15:22:59

标签: r xts tibble

从tibble软件包2.0.1版本开始,将xts对象转换为tibble的最佳方法是什么? 考虑以下示例

library(tibble)
library(xts)

myxts <- xts(matrix(1:4, 2, 2), order.by = seq.Date(from = as.Date("2019-02-26"), length.out = 2, by = "d"))

as_tibble(myxts)

这给出了警告:

  

警告消息:不建议在引导程序上调用as_tibble(),   因为这种行为将来可能会改变。采用   改为enframe(name = NULL)

但是使用enframe会导致错误:

enframe(myxts, name = NULL)
  

错误:x的尺寸不得超过一个。 length(dim(x))   必须为零或一,而不是2。

我知道timetk软件包,该软件包具有将xts对象转换为小标题的功能。但是,这个包是孤立的,所以我宁愿避免使用它。

感谢您的反馈。

编辑: 我会对解决这个问题的方法有兴趣:当然可以先将xts对象转换为任意对象(例如,数据帧),然后转换为小标题。 但是不应该也有直接的方法吗?

4 个答案:

答案 0 :(得分:3)

使用fortify.zoo将其转换为数据帧,然后使用as.tibble将其转换为小标题。

myxts %>% fortify.zoo %>% as.tibble

给予:

# A tibble: 2 x 3
  Index          .   ..1
  <date>     <int> <int>
1 2019-02-26     1     3
2 2019-02-27     2     4

答案 1 :(得分:3)

怎么样as_tibble(xts) %>% add_column(day = index(xts), .before = 1, )

答案 2 :(得分:2)

现在可以使用broom::tidy()函数将xts对象转换为小对象,并且该函数比ggplot2::fortify()更为可取,因为根据R,将来可能不推荐使用此函数ggplot2::fortify()的帮助。

library(quantmod)
library(broom)

symbol <- getSymbols("AAPL", src = "yahoo", from = as.Date("2014-01-01"),
                     to = as.Date("2014-12-31"),auto.assign=FALSE)
symbol_df <- tidy(symbol)
str(symbol_df)

...以及输出:

> str(symbol_df)
tibble [1,506 × 3] (S3: tbl_df/tbl/data.frame)
 $ index : Date[1:1506], format: "2014-01-02" "2014-01-02" ...
 $ series: chr [1:1506] "AAPL.Open" "AAPL.High" "AAPL.Low" "AAPL.Close" ...
 $ value : num [1:1506] 1.98e+01 1.99e+01 1.97e+01 1.98e+01 2.35e+08 ...

答案 3 :(得分:0)

我会选择继续使用 broom::tidy 函数并通过 nest(index, value) 步骤对其进行扩充,以便更好地了解基础数据。请注意,symbol 是 R xts 对象的示例。

library(quantmod)
library(broom)
library(tidyverse)

symbol <- getSymbols("AAPL", 
                     src = "yahoo", 
                     from = as.Date("2014-01-01"),
                     to = as.Date("2014-12-31"), 
                     auto.assign=FALSE)

symbol_df <- broom::tidy(symbol) %>% nest(index, value)

symbol_df 现在将在单独的小标题中提供时间序列数据可用的每个类别:

# A tibble: 6 x 2
  series        data              
  <chr>         <list>            
1 AAPL.Open     <tibble [251 x 2]>
2 AAPL.High     <tibble [251 x 2]>
3 AAPL.Low      <tibble [251 x 2]>
4 AAPL.Close    <tibble [251 x 2]>
5 AAPL.Volume   <tibble [251 x 2]>
6 AAPL.Adjusted <tibble [251 x 2]>

此时,如果您要查找对应于 AAPL.Volume 的时间序列数据,接下来的步骤如下:

symbol_df %>% 
  filter(series == "AAPL.Volume") %>% 
  pull(data) %>% as.data.frame() %>% as_tibble()

给予

# A tibble: 251 x 2
   index          value
   <date>         <dbl>
 1 2014-01-02 234684800
 2 2014-01-03 392467600
 3 2014-01-06 412610800
 4 2014-01-07 317209200
 5 2014-01-08 258529600
 6 2014-01-09 279148800
 7 2014-01-10 304976000
 8 2014-01-13 378492800
 9 2014-01-14 332561600
10 2014-01-15 391638800
# ... with 241 more rows