2016-09-09 105 views
1
日期範圍內計算總和

假設我有與十年每天的溫度數據的數據幀(以度C)是這樣的:的R - 使用動物園

mydf <- data.frame(Date = seq(as.Date("2001/1/1"), as.Date("2010/12/31"), by = "day"), Temp = runif(3652, 0, 40)) 

我試圖計算出植物生長度日。這是如何工作的:在一個日期範圍內,我需要整合日常溫度和基礎溫度之間的差異,比如說10攝氏度。爲了使它更難,日期範圍跨越幾年。例如,我需要計算時間序列中所有年份在11月1日至3月31日之間的增長日期。就「算法」而言,邏輯將如下所示:

t_base <- 10 

for (each day between nov 1st and mar 31st) { 
    sum (Temp - t_base) 
} 

如何使用zoo軟件包執行此操作?

回答

1

注意"yearmon「類變量的形式爲一年+壓裂在壓裂是0月,爲1/12二月,爲2/12三月等在下面ym的是對應於Date一個"yearmon"載體除我們已經增加了兩個月ym然後分爲年度y(賽季結束的一年)和月份m(其中月份爲本季的第一個月爲0,第二個月爲1,...,第四個爲in.seas對於11月,12月,1月,2月或3月(對應於m <= 4)的數據點爲TRUE,最後使用ave計算日期之間的累計和具有相同的季節 - 結束年份或aggregate來計算總和。

library(zoo) 

z <- read.zoo(mydf) 
ym <- as.numeric(as.yearmon(index(z)) + 2/12) 
y <- floor(ym) # year of date's season end or this year if not in season 
m <- round(12 * (ym - y)) # month Nov = 0, Dec = 1, Jan = 2, Feb = 3, Mar = 4, ... 
in.seas <- m <= 4 
Cum <- ave(z[in.seas], y[in.seas], FUN = function(x) cumsum(x - t_base)) 

或只得到每個賽季的總和:

Sum <- aggregate(z[in.seas], y[in.seas], function(x) sum(x - t_base)) 

注意fortify.zoo(x)將動物園對象x重新轉換爲數據幀應該說是必要的。

+1

已將評論移動給回覆。 –

+0

很酷,謝謝你的回答,並且感謝很棒的'動物園'包裝。 – thiagoveloso