【问题标题】:Plot time data in R to various resolutions (to the minute, to the hour, to the second, etc.)将 R 中的时间数据绘制为各种分辨率(分钟、小时、秒等)
【发布时间】:2010-11-18 09:16:18
【问题描述】:

我在 CSV 中有一些数据,例如:

"Timestamp", "Count"
"2009-07-20 16:30:45", 10
"2009-07-20 16:30:45", 15
"2009-07-20 16:30:46", 8
"2009-07-20 16:30:46", 6
"2009-07-20 16:30:46", 8
"2009-07-20 16:30:47", 20

我可以使用 read.cvs 将它读入 R。我想绘制:

  1. 每秒的条目数,因此: "2009-07-20 16:30:45", 2 "2009-07-20 16:30:46", 3 "2009-07-20 16:30:47", 1
  2. 每秒平均值: "2009-07-20 16:30:45", 12.5 "2009-07-20 16:30:46", 7.333 "2009-07-20 16:30:47", 20
  3. 与 1 和 2 相同,但先按分钟,然后按小时。

有没有办法在 R 中做到这一点(按秒/分钟/等和情节收集)?

【问题讨论】:

    标签: r time statistics plot


    【解决方案1】:

    读取您的数据,并将其转换为zoo 对象:

    R> X <- read.csv("/tmp/so.csv")
    R> X <- zoo(X$Count, order.by=as.POSIXct(as.character(X[,1])))
    

    请注意,由于时间戳不唯一,这将显示警告。

    任务 1 使用 aggregate 和 length 进行计数:

    R> aggregate(X, force, length)
    2009-07-20 16:30:45 2009-07-20 16:30:46 2009-07-20 16:30:47 
                      2                   3                   1 
    

    任务 2 使用 aggregate:

    R> aggregate(X, force, mean)
    2009-07-20 16:30:45 2009-07-20 16:30:46 2009-07-20 16:30:47 
                 12.500               7.333              20.000 
    

    任务 3 可以通过聚合到高阶索引以相同的方式完成。您可以在聚合结果上调用plot:

    plot(aggregate(X, force, mean))
    

    【讨论】:

    • 不错!我必须在包管理器中添加 Zoo 包并首先调用“library(zoo)”。
    • 是的,这就是它与包一起工作的方式。对于您的每小时等索引,请使用“解析时间”(此处:创建动物园对象后的 index(X))并创建您在聚合中使用的“聚合索引向量”:R> aggind aggregate(X, aggind, mean) 20090720 1607 11.17 对其他索引(更改格式规则)和函数(用你需要的任何东西替换平均值)完全相同)。
    • 再次,很好!我注意到,当我制作一个聚合索引向量时,如: R> aggind
    • 分配温度。结果到一个变量并在其上运行 summary() - 你可能有 NA 会抛出一些绘图。
    【解决方案2】:

    使用 plyr 包可以轻松平均数据。

    library(plyr)
    Second <- ddply(dataset, "Timestamp", function(x){
        c(Average = mean(x$Count), N = nrow(x))
    })
    

    要按分钟或按小时执行相同的操作,则需要添加包含该信息的字段。

    library(chron)
    dataset$Minute <- minutes(dataset$Timestamp)
    dataset$Hour <- hours(dataset$Timestamp)
    dataset$Day <- dates(dataset$Timestamp)
    #aggregate by hour
    Hour <- ddply(dataset, c("Day", "Hour"), function(x){
        c(Average = mean(x$Count), N = nrow(x))
    })
    #aggregate by minute
    Minute <- ddply(dataset, c("Day", "Hour", "Minute"), function(x){
        c(Average = mean(x$Count), N = nrow(x))
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-11
      • 2015-05-18
      • 2020-02-06
      相关资源
      最近更新 更多