我有一個時間系列(索引類型爲chron的動物園),我需要在每一天分別在一個新的動物園對象中計算cummax(mydata)-mydata
。按時間間隔向量運算,在R ??中,合計
我已經試過這樣:
aggregate(mydata, as.date, cummax)
但aggregate
只能產生一個標結果對每個子集,而不是一個向量。我讀過,也許tapply
,lapply
,plyr
,cut
或rollapply
可以做到這一點,但我無法讓他們工作。
我有一個時間系列(索引類型爲chron的動物園),我需要在每一天分別在一個新的動物園對象中計算cummax(mydata)-mydata
。按時間間隔向量運算,在R ??中,合計
我已經試過這樣:
aggregate(mydata, as.date, cummax)
但aggregate
只能產生一個標結果對每個子集,而不是一個向量。我讀過,也許tapply
,lapply
,plyr
,cut
或rollapply
可以做到這一點,但我無法讓他們工作。
zoo
有cummax
方法,所以你不應該得到一個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
你好,我會研究你的答案,謝謝。與此同時,我必須做這個tapply(z,as.Date(index(z)),cummax),但它給了我一個列表,當我嘗試將它轉換爲動物園對象時,使用unlist或unsplit,我會得到奇怪的東西日期。歡呼聲 – skan 2010-08-20 16:33:09
這比我的回答更簡單。你只是缺少'do.call'部分:'Z < - do.call(rbind,tapply(z,as.Date(index(z)),cummax))' – 2010-08-20 17:51:22
粗方法:使對應於在該計算是塊中的行或列的矩陣來完成,然後使用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)
它可以在一行中使用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
的樣本數據會去幫助專家很長的路在這裏幫助你。 – Chase 2010-08-20 01:13:04