从 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)
Run Code Online (Sandbox Code Playgroud)
这给出了警告:
警告信息:
as_tibble()不鼓励调用引导程序,因为该行为将来可能会发生变化。使用enframe(name = NULL)来代替。
但是使用会enframe导致错误:
enframe(myxts, name = NULL)
Run Code Online (Sandbox Code Playgroud)
错误:
x不能超过一维。length(dim(x))必须为零或一,而不是 2。
我知道该timetk包具有将 xts 对象转换为 tibbles 的功能。但是,这个包是孤立的,所以我宁愿避免它。
感谢您的反馈。
编辑:
我会对这个问题的 tidyverse 解决方案感兴趣:当然,可以先将xts对象转换为任意对象(例如数据帧),然后再转换为 tibble。但是不应该也有直接的方法吗?
EDIT2: 从 tibble 包版本 3.0.3 开始,警告不再出现。特别是可以使用 Yakov-vc 的答案中的那一行来进行“整洁”的转换。
使用fortify.zoo将其转换为数据帧,然后as.tibble将其转换为一个tibble。
myxts %>% fortify.zoo %>% as.tibble
Run Code Online (Sandbox Code Playgroud)
给予:
# A tibble: 2 x 3
Index . ..1
<date> <int> <int>
1 2019-02-26 1 3
2 2019-02-27 2 4
Run Code Online (Sandbox Code Playgroud)
由于 tibble 包中的更改,如果 myxts 没有名称(或具有 tibble 不喜欢的名称),则上述内容不再有效,因此请改用:
myxts %>% fortify.zoo %>% as_tibble(.name_repair = "minimal")
Run Code Online (Sandbox Code Playgroud)
建议使用 broom::tidy 的另外两个答案,尽管这适用于某些 xts 对象,但在与问题中的 myxts 对象一起使用时会生成错误消息。还有一个答案说,从 ggplot2 中删除 fortify 可能会导致问题,但如果我们直接调用 fortify.zoo,就像我们在上面的代码行中所做的那样,这段代码将继续工作。
2021 年 3 月 30 日。刚刚使用 tibble 3.1.0 重新审视了这一点,现在以下确实运行而不会产生错误或警告;但是,缺少索引,因此使用 fortify.zoo 的上述方法仍然是转换的最佳方式。
as_tibble(myxts) # index missing
Run Code Online (Sandbox Code Playgroud)