【问题标题】:Converting Data Frames to XTS: order.by requires an appropriate time-based object将数据帧转换为 XTS:order.by 需要适当的基于时间的对象
【发布时间】:2022-01-19 22:42:34
【问题描述】:

我有以下名为“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()

谁能告诉我如何解决这个问题?

参考资料:

【问题讨论】:

    标签: r dplyr time-series data-visualization data-manipulation


    【解决方案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"))
    

    【讨论】:

    • 在我的原始文件(称为“my_data”)中有一个日期变量(“my_date”),格式为 DAY-MONTH-YEAR,日期为“因子”格式。日期如下所示:05-OCT-21
    • 您认为与另一种日期格式(05-OCT-21)相比,使用这种日期格式(05-OCT-21)可能更好/更容易吗?非常感谢!
    • 是的,我编辑了我的答案。
    【解决方案2】:

    ?dygraph 表示可以使用任何可转换为 xts 的类,因此假设我们在最后的注释中可重现地显示数据框,请使用 read.zoo 将其转换为具有 yearmon 类索引的动物园对象,然后调用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]])
    

    【讨论】:

    • @G. Grothendieck:非常感谢!这太简单了!这些包中似乎已经包含了“as.yearmon”功能。
    猜你喜欢
    • 2014-06-07
    • 2012-07-12
    • 2012-04-03
    • 1970-01-01
    • 2022-10-05
    • 2016-04-08
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多