7

我想按小时平均值聚合数据。日常很简单:

apply.daily(X2,mean)

为什么没有每小时的功能?我试过了

hr.means <- aggregate(X2, format(X2["timestamp"],"%Y-%m-%d %H"))

trim 参数总是出错。有没有类似apply.daily的更简单的功能?如果我想汇总 5 分钟的平均值怎么办。数据是每分钟的值:

"timestamp", value 
"2012-04-09 05:03:00",2
"2012-04-09 05:04:00",4
"2012-04-09 05:05:00",5
"2012-04-09 05:06:00",0
"2012-04-09 05:07:00",0
"2012-04-09 05:08:00",3
"2012-04-09 05:09:00",0
"2012-04-09 05:10:00",1

我正在使用 xts 和动物园。

4

3 回答 3

17

尝试

period.apply(X2, endpoints(X2, "hours"), mean)

apply.daily只是上面的一个包装器:

> apply.daily
function (x, FUN, ...)
{
    ep <- endpoints(x, "days")
    period.apply(x, ep, FUN, ...)
}
于 2013-04-15T16:02:17.820 回答
2
hr.means <- aggregate(X2, format(time(X2),"%y-%m-%d %H"), mean) 

这应该可以正常工作。

于 2015-07-07T14:35:21.733 回答
1

回答第 2 部分:

如果我想汇总 5 分钟的平均值怎么办?

正如@eddit 在上面的评论中已经提到的:

df <- read.table(header=TRUE, sep=",", stringsAsFactors=FALSE, text="
timestamp, value 
2012-04-09 05:03:00,2
2012-04-09 05:04:00,4
2012-04-09 05:05:00,5
2012-04-09 05:06:00,0
2012-04-09 05:07:00,0
2012-04-09 05:08:00,3
2012-04-09 05:09:00,0
2012-04-09 05:10:00,1")
X2 <- xts(df$value, as.POSIXct(df$timestamp))

X2.5min <- period.apply(X2, endpoints(X2, "minutes", 5), mean)

我得到:05:04:00 - 4;05:09:00 - 5,... 但也许可以将第一个值设置为 05:00:00 并继续 05:05:00 可能会更容易,如果我稍后合并文件以具有相同的开始和时间步长。

的确:

> X2.5min
                    [,1]
2012-04-09 05:04:00  3.0
2012-04-09 05:09:00  1.6
2012-04-09 05:10:00  1.0

Cross Validated的Darren Cook遇到了同样的问题并写了函数align.time.down

align.time.down=function(x,n){index(x)=index(x)-n;align.time(x,n)}

这可以用来调整时间:

X2.5mindown <- align.time.down(X2.5min, 5 * 60)
X2.5mindown
                    [,1]
2012-04-09 05:00:00  3.0
2012-04-09 05:05:00  1.6
2012-04-09 05:10:00  1.0
于 2015-08-07T02:24:58.600 回答