【问题标题】:R - time series reduction with plot for multiple columnsR - 时间序列减少与多列的情节
【发布时间】:2018-09-16 18:14:47
【问题描述】:

我有数据,其中每 5 分钟测量一次 MV_1、MV_2、MV_3 ...、MV_40 变量。现在我必须每小时汇总一次并制作一个 time_series 图(对于每个变量应该是单独的图 - 变量随时间的变化)。数据类型如下(只是一小部分 - 有超过 1000 个时间点)。

date                MV_1 MV_2
2017-07-08 01:19:37 212 163
2017-07-08 01:24:41 222 162
2017-07-08 01:29:37 207 162
2017-07-08 01:34:41 189 161
2017-07-08 01:39:37 220 161
2017-07-08 01:44:41 186 16
2017-07-08 01:49:37 193 16
2017-07-08 01:54:40 186 159
2017-07-08 01:59:37 194 159
2017-07-08 02:04:40 193 159
2017-07-08 02:09:37 183 159
2017-07-08 02:14:40 215 158
2017-07-08 02:19:37 213 158
2017-07-08 02:24:40 209 157

第一列包含 POSIXct 格式的小时数据(%Y-%M-%D %h:%m:%S 格式),第二列和第三列是数字。

对于一小时平均测量的聚合这种类型(它必须是平均值),我已经完成了如下操作

aggregate(my_data[MV_1], list(hour=cut(as.POSIXct(my_data$date)-1, "hour")), mean)

然后绘制。这适用于所有列(MV_2、MV_3 等)。

但是有没有办法更简单并自动化流程?

【问题讨论】:

    标签: r time-series


    【解决方案1】:

    假设数据框DF在最后的注释中重复显示:

    DF$date <- as.POSIXct(DF$date)
    hour <- as.POSIXct(trunc(DF$date, "hour"))
    avg <- aggregate(DF[-1], data.frame(hour), mean)
    
    avg
    ##                  hour  MV_1     MV_2
    ## 1 2017-07-08 01:00:00 201.0 128.7778
    ## 2 2017-07-08 02:00:00 202.6 158.2000
    
    matplot(avg[[1]], avg[-1], type = "l", xaxt = "n")
    Axis(DF[[1]], side = 1)
    

    动物园

    或者要使用时间序列表示转换为动物园,请使用 aggregate.zoo 并使用经典或 ggplot2 图形进行绘图,如图所示。这些图在同一图上绘制每个系列。如果您想要单独的图,请分别省略 screen=1 和 facet=NULL。

    library(zoo)
    
    z <- read.zoo(DF)
    hour <- as.POSIXct(trunc(time(z), "hour"))
    zavg <- aggregate(z, hour, mean)
    zavg
    ##                      MV_1     MV_2
    ## 2017-07-08 01:00:00 201.0 128.7778
    ## 2017-07-08 02:00:00 202.6 158.2000
    
    # classic graphics
    plot(zavg, screen = 1)
    
    # or ggplot2 graphics
    library(ggplot2)
    autoplot(zavg, facet = NULL)
    

    注意

    Lines <- "date                MV_1 MV_2
    2017-07-08 01:19:37 212 163
    2017-07-08 01:24:41 222 162
    2017-07-08 01:29:37 207 162
    2017-07-08 01:34:41 189 161
    2017-07-08 01:39:37 220 161
    2017-07-08 01:44:41 186 16
    2017-07-08 01:49:37 193 16
    2017-07-08 01:54:40 186 159
    2017-07-08 01:59:37 194 159
    2017-07-08 02:04:40 193 159
    2017-07-08 02:09:37 183 159
    2017-07-08 02:14:40 215 158
    2017-07-08 02:19:37 213 158
    2017-07-08 02:24:40 209 157"
    L <- trimws(readLines(textConnection(Lines)))
    L <- gsub(" +", ",", L)
    L <- sub(",", " ", L)
    L[1] <- sub(" ", ",", L[1])
    DF <- read.csv(text = L)
    

    【讨论】:

    • @ 谢谢!还有一个问题 - 我应该如何修改代码以获得完全独立的图(我需要稍后将它们保存为单独的 .jpg 文件) - 如果我在单独的系列中省略 screen=1 或 facet = NULL 但仍然在一个屏幕上。
    • ` pdf(); for(i in 1:ncol(zavg)) plot(zavg[, i], ylab = names(zavg)[i]); dev.off()`
    【解决方案2】:

    使用tidyverse 和lubridate:

    df %>%
      group_by(hour = floor_date(date, unit = "hour")) %>%
      summarise_at(vars(contains("MV")), funs(mean(., na.rm = TRUE))) %>%
      melt(id = "hour") %>%
      ggplot(aes(x = hour, y = value, colour = variable)) + 
      geom_line() + 
      facet_grid( ~ variable) + 
      theme_bw()
    

    或者,如果您决定将所有时间序列放在一个情节中:

    df %>%
      group_by(hour = floor_date(date, unit = "hour")) %>%
      summarise_at(vars(contains("MV")), funs(mean(., na.rm = TRUE))) %>%
      melt(id = "hour") %>%
      ggplot(aes(x = hour, y = value, colour = variable, group = variable)) + geom_line()
    

    【讨论】:

    • 非常感谢!以及与上面相同的问题 - 是否有一种简单的方法可以强制生成完全独立的图(从单系列图,而不是多系列图 - 刚刚准备好)以便稍后将它们保存在单独的 /jpg 文件中?跨度>
    猜你喜欢
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    相关资源
    最近更新 更多