2010-08-20 103 views
0

我有一個時間系列(索引類型爲chron的動物園),我需要在每一天分別在一個新的動物園對象中計算cummax(mydata)-mydata按時間間隔向量運算,在R ??中,合計

我已經試過這樣:

aggregate(mydata, as.date, cummax) 

aggregate只能產生一個標結果對每個子集,而不是一個向量。我讀過,也許tapply,lapply,plyr,cutrollapply可以做到這一點,但我無法讓他們工作。

+0

的樣本數據會去幫助專家很長的路在這裏幫助你。 – Chase 2010-08-20 01:13:04

回答

1

zoocummax方法,所以你不應該得到一個zoo產生的任何問題。也許你讓這更難以比...這是你想要的嗎?

> set.seed(21) 
> z <- zoo(runif(10),as.chron(Sys.Date()-10:1)) 
> merge(z,cummax=cummax(z),diff=cummax(z)-z) 
        z cummax  diff 
08/09/10 0.66754012 0.6675401 0.0000000 
08/10/10 0.93521022 0.9352102 0.0000000 
08/11/10 0.05818433 0.9352102 0.8770259 
08/12/10 0.61861583 0.9352102 0.3165944 
08/13/10 0.17491846 0.9352102 0.7602918 
08/14/10 0.03767539 0.9352102 0.8975348 
08/15/10 0.52531317 0.9352102 0.4098971 
08/16/10 0.28218425 0.9352102 0.6530260 
08/17/10 0.49904520 0.9352102 0.4361650 
08/18/10 0.63382510 0.9352102 0.3013851 

既然這很容易,我猜你的時間序列是一個日內的頻率。如果是這樣的話,代碼更復雜,但是這應該做的伎倆:

> require(xts) # for the endpoints() function 
> set.seed(21) 
> z <- zoo(runif(10),as.chron(Sys.Date()-seq(0.5,3,length.out=10))) 
> ep <- endpoints(z,"days") 
> Z <- lapply(1:(length(ep)-1), function(x) cummax(z[(ep[x]+1):ep[x+1]])) 
> Z <- do.call(rbind, Z) 
> merge(z,Z,Z-z) 
          z   Z  Z - z 
(08/16/10 00:00:00) 0.8493961 0.8493961 0.0000000 
(08/16/10 06:40:00) 0.9860037 0.9860037 0.0000000 
(08/16/10 13:20:00) 0.1721917 0.9860037 0.8138120 
(08/16/10 20:00:00) 0.1018046 0.9860037 0.8841991 
(08/17/10 02:40:00) 0.9186834 0.9186834 0.0000000 
(08/17/10 09:20:00) 0.9596138 0.9596138 0.0000000 
(08/17/10 16:00:00) 0.1844608 0.9596138 0.7751531 
(08/17/10 22:40:00) 0.6992523 0.9596138 0.2603615 
(08/18/10 05:20:00) 0.2524456 0.2524456 0.0000000 
(08/18/10 12:00:00) 0.7861149 0.7861149 0.0000000 
+0

你好,我會研究你的答案,謝謝。與此同時,我必須做這個tapply(z,as.Date(index(z)),cummax),但它給了我一個列表,當我嘗試將它轉換爲動物園對象時,使用unlist或unsplit,我會得到奇怪的東西日期。歡呼聲 – skan 2010-08-20 16:33:09

+0

這比我的回答更簡單。你只是缺少'do.call'部分:'Z < - do.call(rbind,tapply(z,as.Date(index(z)),cummax))' – 2010-08-20 17:51:22

0

粗方法:使對應於在該計算是塊中的行或列的矩陣來完成,然後使用apply

x <- rnorm(240) # imagine this to be 10 days of hourly data 
xm <- matrix(x, ncol=24, byrow=TRUE) 
daily.avg <- apply(xm, 1, mean) 
plot(x) 
lines(12 + seq(1,240,24), daily.avg) 
0

它可以在一行中使用AVE完成:(!不是我)

> library(zoo) 
> set.seed(123) 
> z <- zoo(rnorm(10), chron(0:9/5)) 
> 
> ave(coredata(z), as.Date(time(z)), FUN = cummax) - z 
(01/01/70 00:00:00) (01/01/70 04:48:00) (01/01/70 09:36:00) (01/01/70 14:24:00) (01/01/70 19:12:00) (01/02/70 00:00:00) (01/02/70 04:48:00) 
      0.000000   0.000000   0.000000   1.488200   1.429421   0.000000   1.254149 
(01/02/70 09:36:00) (01/02/70 14:24:00) (01/02/70 19:12:00) 
      2.980126   2.401918   2.160727