2011-01-13 110 views
7

说我有以下矩阵:计算为r的日平均

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

有一种简单的方式来获得行的1平均:24,25:48,49:72,73:96第2列?

基本上我有一个一年的时间系列,我必须每24小时平均一些数据。

回答

8

有。

假设我们有天:

Days <- rep(1:4,each=24) 

你可以做很容易

tapply(x2[,2],Days,mean) 

如果你有一个数据帧带有日期的变量,你可以使用一个。您可以一次做到这一点对所有的变量,使用聚合:

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

+0

@SnowFrog你错了。 tapply不会创建数据框。它创建一个向量(在这种情况下)。巨大差距。 – 2013-11-13 11:58:55

+0

'tapply`方法的一个问题是它会创建一个向量(列数=天数)。'aggregate'方法创建一个数据框(1行,行数=天数),如果需要后续的数据处理,这可能更实用。 – SnowFrog 2013-11-20 11:07:24

2

相当紧凑和快速的计算方法是将矢量重塑为合适的矩阵并计算列me答。

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

干净的解决方案,只要没有任何地方丢失数据。否则矩阵不会代表日子。 – 2011-01-14 12:14:00

4

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是输出然后coredata(zz)time(zz)分别是作为普通向量的值和时间。