在R中计算每日平均值

7

假设我有以下矩阵:

x1 = 1:288
x2 = matrix(x1,nrow=96,ncol=3)

有没有一种简单的方法来获取第2列在第1到24行,25到48行,49到72行和73到96行中的平均值?

基本上,我有一个一年的时间序列,我需要每24小时平均一些数据。

3个回答

10

有的。

假设我们有这些天:

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)。


@SnowFrog 你错了。tapply 不会创建数据框,它会创建一个向量(在这种情况下)。这是很大的区别。 - Joris Meys
tapply 方法的一个问题是它创建了一个向量(列数=天数)。aggregate 方法创建了一个数据框(1 列,行数=天数),如果需要对数据进行后续操作,则更实用。 - SnowFrog
1
如果您尚未为Days创建独立的对象并且它只是df中的一列,则对于aggregate(),您需要指定df $ Days。 - dez93_2000

6

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)分别是普通向量中的值和时间。

+1 是为了展示如何使用 zoo 和 ts 进行操作。我没有在一开始提到它,因为我不想对实际问题中的数据做出太多假设,但这确实是相关且有帮助的。 - Joris Meys

4

将向量转换成适当的矩阵并计算列平均值,是一种非常紧凑且计算速度快的方式。

colMeans(matrix(x2[,2],nrow=24))

只要没有任何缺失数据,这将是一个干净的解决方案。否则,矩阵就不能代表这些天。 - Joris Meys
你需要小心使用这种方法以确保维度正确。但你可以通过在缺失数据处使用 NA 并使用 na.rm=TRUE 来处理缺失数据。 - Matti Pastell
我知道的 :-) 我的意思是缺失,指的是“不是每天都有24行数据”。 - Joris Meys

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接