假设我有以下矩阵:
x1 = 1:288
x2 = matrix(x1,nrow=96,ncol=3)
有没有一种简单的方法来获取第2列在第1到24行,25到48行,49到72行和73到96行中的平均值?
基本上,我有一个一年的时间序列,我需要每24小时平均一些数据。
假设我有以下矩阵:
x1 = 1:288
x2 = matrix(x1,nrow=96,ncol=3)
有没有一种简单的方法来获取第2列在第1到24行,25到48行,49到72行和73到96行中的平均值?
基本上,我有一个一年的时间序列,我需要每24小时平均一些数据。
有的。
假设我们有这些天:
Days <- rep(1:4,each=24)
你可以轻松地做到
tapply(x2[,2],Days,mean)
如果您有一个带有日期变量的数据框,您可以使用它。您可以一次为所有变量执行此操作,使用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) 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) zoo. 这里使用了zoo包。如果需要扩展,zoo包也可以处理不规则间隔的时间序列。下面的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
aggregate
的输出是zz
,那么coredata(zz)
和time(zz)
分别是普通向量中的值和时间。将向量转换成适当的矩阵并计算列平均值,是一种非常紧凑且计算速度快的方式。
colMeans(matrix(x2[,2],nrow=24))
tapply
方法的一个问题是它创建了一个向量(列数=天数)。aggregate
方法创建了一个数据框(1 列,行数=天数),如果需要对数据进行后续操作,则更实用。 - SnowFrog