说我有以下矩阵:
x1 = 1:288
x2 = matrix(x1,nrow=96,ncol=3)
是否有一种简单的方法可以获得第2列的第1:24,25:48,49:72,73:96行的平均值?
基本上我有一年的时间序列,我必须每24小时平均一些数据。
答案 0 :(得分:8)
有。
假设我们有这些日子:
Days <- rep(1:4,each=24)
你可以轻松地做到
tapply(x2[,2],Days,mean)
如果您有一个带有Date变量的数据框,则可以使用该变量。您可以使用aggregate:
一次对所有变量执行此操作x2 <- as.data.frame(cbind(x2,Days))
aggregate(x2[,1:3],by=list(Days),mean)
首先看一下这些功能的帮助文件。也可以在这里搜索一下,关于这个问题还有其他一些有趣的答案:
PS:如果你要做很多时间序,你应该看一下zoo包(在CRAN:http://cran.r-project.org/web/packages/zoo/index.html上)
答案 1 :(得分:5)
1)ts。由于这是一个规则间隔的时间序列,请将其转换为ts
系列,然后将其从频率24汇总到频率1:
aggregate(ts(x2[, 2], freq = 24), 1, mean)
,并提供:
Time Series:
Start = 1
End = 4
Frequency = 1
[1] 108.5 132.5 156.5 180.5
2)动物园。这里是使用动物园。动物园包也可以处理不规则间隔的系列(如果我们需要扩展它)。 day.hour
以下是日期编号(1,2,3,4)加上当天的一小部分时间,因此floor(day.hour)
只是日期编号:
library(zoo)
day.hour <- seq(1, length = length(x2[, 2]), by = 1/24)
z <- zoo(x2[, 2], day.hour)
aggregate(z, floor, mean)
## 1 2 3 4
## 108.5 132.5 156.5 180.5
如果zz
是aggregate
的输出,那么coredata(zz)
和time(zz)
分别是值和时间,作为普通向量。
答案 2 :(得分:3)
相当紧凑且计算速度快的方法是将矢量重新整形为合适的矩阵并计算列均值。
colMeans(matrix(x2[,2],nrow=24))