9

我在 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 中做到这一点(按秒/分钟/等和情节收集)?

4

2 回答 2

7

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

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

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

任务 1 使用aggregatewithlength计数:

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))
于 2009-08-10T18:50:39.813 回答
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))
})
于 2009-08-10T18:51:22.337 回答