2011-01-13 111 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)分別是作爲普通向量的值和時間。