提问人:stats_noob 提问时间:1/19/2022 最后编辑:user438383stats_noob 更新时间:1/19/2022 访问量:430
将数据帧转换为 XTS:order.by 需要适当的基于时间的对象
Converting Data Frames to XTS: order.by requires an appropriate time-based object
问:
我有以下数据集,称为“my_data”(数据框) - 日期是“因子类型”,代表“年-月”(注意:此数据框是使用“dplyr group_by/summarise”命令从原始数据框创建的 - 然后是“tidyverse”中的“pivot_longer”命令以“长格式”制作数据):
head(my_data)
col_A.dates col_A.count col_B.count col_C.count col_D.count col_E.count
1 2010-01 189 130 57 58 53
2 2010-02 63 62 25 18 30
3 2010-03 46 24 12 12 11
4 2010-04 45 17 8 16 15
5 2010-05 42 26 13 12 16
我正在尝试使用“dygraph”库 (https://rstudio.github.io/dygraphs/) 制作此数据的时间序列图。
为此,您似乎必须首先将数据框转换为“xts”类型:
library(xts)
xts_data <- xts(my_data[,-1], order.by=my_data[,1])
但这会返回以下错误:
Error in xts(my_data[, -1], order.by = my_data[, 1]) :
order.by requires an appropriate time-based object
这阻止了我创建最终的图表:
library(dygraphs)
dygraph(xts_data) %>% dyRangeSelector()
有人可以告诉我如何解决这个问题吗?
引用:
答:
1赞
cuttlefish44
1/19/2022
#1
也许使用虚拟日期和转换日期类很容易。 下面是一个示例;
library(tidyverse); library(xts)
dummy_date <- "-15"
my_data2 <- my_data %>%
mutate(col_A.dates = as.Date(paste0(as.character(col_A.dates), dummy_date)))
xts_data <- xts(my_data2[,-1], order.by=my_data2[,1]) # if my_data2 is tibble, order_by = my_data2[[1]]
dygraph(xts_data) %>% dyRangeSelector()
评论响应
是的,如果我是你,我会直接将“05-OCT-21”转换为日期类并使用它。
## example
# depending on you locale, it is needed to change locale. (if do so, please delete #)
# lct <- Sys.getlocale("LC_TIME") # keep origin locale
# Sys.setlocale("LC_TIME", "C") # change locale
as.Date(as.character("05-OCT-21"), format = "%d-%b-%y")
# Sys.setlocale("LC_TIME", lct) # return origin locale
### expected_code
my_data2 <- my_data %>%
mutate(col_A.dates = as.Date(as.character(origiinal_date), format = "%d-%b-%y"))
评论
0赞
stats_noob
1/19/2022
在我的原始文件(称为“my_data”)中,有一个日期变量(“my_date”),其格式为日-月-年,日期为“因子”格式。日期如下所示: 05-OCT-21
0赞
stats_noob
1/19/2022
您认为与另一种日期格式相比,使用这种日期格式(05-OCT-21)可能更好/更容易吗?非常感谢!
0赞
cuttlefish44
1/19/2022
是的,我编辑了我的答案。
1赞
G. Grothendieck
1/19/2022
#2
?dygraph 表示可以使用任何可转换为 XTS 的类,因此假设我们在注释中可重现地显示数据帧,最后使用 read.zoo 将其转换为具有 yearmon 类索引的 zoo 对象,然后调用 dygraph。
library(zoo)
z <- read.zoo(my_data, FUN = as.yearmon)
library(dygraphs)
dygraph(z)
或者使用 ggplot2(有关详细信息,请参见 ?autoplot.zoo):
library(ggplot2)
autoplot(z, facets = NULL)
除了上面的东西,我们真的不需要任何东西,但以防万一,如果你想要一个 Date 类索引、一个 xts 对象或一个 ts 对象,那么一旦我们有了 z,就很容易将其转换为许多其他形式。
zd <- aggregate(z, as.Date)
library(xts)
x <- as.xts(z)
as.ts(z)
注意
Lines <- " col_A.dates col_A.count col_B.count col_C.count col_D.count col_E.count
1 2010-01 189 130 57 58 53
2 2010-02 63 62 25 18 30
3 2010-03 46 24 12 12 11
4 2010-04 45 17 8 16 15
5 2010-05 42 26 13 12 16"
my_data <- read.table(text = Lines, check.names = FALSE)
my_data[[1]] <- factor(my_data[[1]])
评论
0赞
stats_noob
1/20/2022
@G. Grothendieck:非常感谢!这太简单了!似乎函数“as.yearmon”已经包含在这些包中。
评论