2015-11-20 54 views
0

我的問題時薪數額如下:我有與像五分鐘沉澱數據的時間序列:聚合5分鐘的數據與目前NA的

  Datum mm 
1 2004-04-08 00:05:00 NA 
2 2004-04-08 00:10:00 NA 
3 2004-04-08 00:15:00 NA 
4 2004-04-08 00:20:00 NA 
5 2004-04-08 00:25:00 NA 
6 2004-04-08 00:30:00 NA 

這種結構:

'data.frame': 1098144 obs. of 2 variables: 
$ Datum: POSIXlt, format: "2004-04-08 00:05:00" "2004-04-08 00:10:00" "2004-04-08 00:15:00" "2004-04-08 00:20:00" ... 
$ mm : num NA NA NA NA NA NA NA NA NA NA ... 

正如您所看到的,時間序列以很多NA's開頭,但降水量進一步下降,儘管由於測量站故障導致單個不太常見的NA's

我試圖達到的目標,是將測得的降水總結爲小時總和,不考慮NA's

這是我試過到目前爲止:

sums <- aggregate(precip["mm"], 
       list(cut(precip$Datum, "1 hour")), sum) 

即使時間戳正確地聚集到幾個小時,所有款項都0NA。如果根本沒有NA,則計算的金額甚至不計算在內。

EDIT附加地被考慮:

在氣象學每小時的沉澱總和始終描述的累積和直到一定小時:沉澱的在0:00點鐘的量描述從總和前一天的23:00 直到 0:00。所以我總是需要總結前一小時。

重複的例子,

set.seed(1120) 
s <- as.POSIXlt("2004-03-08 23:00:00") 
r <- seq(s, s+1e4, "30 min") 
precip <- data.frame(Datum=r, mm=sample(c(1:5,NA), 6, T)) 

      Datum mm 
2004-03-08 23:00:00 4 
2004-03-08 23:30:00 1 
2004-03-09 00:00:00 2 
2004-03-09 00:30:00 4 
2004-03-09 01:00:00 1 
2004-03-09 01:30:00 4 

通過上面的例子,我要尋找的結果是:

  Datum mm 
2004-03-09 00:00:00 5 
2004-03-09 01:00:00 6 
2004-03-09 02:00:00 5 

幫助,將不勝感激!

謝謝!

+3

對於未來,請考慮閱讀[問]以及如何在R中創建[可重現的示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)。如果您提供明確的預期輸出,它可以讓其他人更容易地幫助您,而無需大量澄清註釋。 – Heroka

+2

在示例數據框中,輸出應該是什麼?請用*實際代碼*回答,而不是輸出的書面描述。 –

+0

我們是否真的來回拖了這麼長時間,並且您一直都有解決方案?我原來的解決方案產生的輸出。 –

回答

2

嘗試增加na.rm=TRUE

aggregate(precip['mm'], list(cut(precip$Datum, "1 hour")), sum, na.rm=TRUE) 
#    Group.1 mm 
# 1 2004-04-08 00:00:00 26 
# 2 2004-04-08 01:00:00 35 
# 3 2004-04-08 02:00:00 25 

重複的例子,

set.seed(1120) 
s <- as.POSIXlt("2004-04-08 00:05:00") 
r <- seq(s, s+1e4, "5 min") 
precip <- data.frame(Datum=r, mm=sample(c(1:5,NA), 34, T)) 

你的第二個問題:如果你想在一個小時測量與計算小時加right=TRUE

aggregate(precip['mm'], list(cut(precip$Datum, "1 hour", right=TRUE)), sum, na.rm=TRUE) 

進一步解釋

我們將創造一個更詳細的解釋,說明該解決方案是如何工作的:

p <- c("2004-04-07 23:48:20", "2004-04-08 00:00:00", "2004-04-08 00:03:20") 
ptime <- as.POSIXlt(p) 
#[1] "2004-04-07 23:48:20 EDT" "2004-04-08 00:00:00 EDT" "2004-04-08 00:03:20 EDT" 

我們有三個日期分成多個組。如果我們使用cut沒有任何額外的參數,第二個條目"2004-04-08 00:00:00 EDT"將與小時"00:00"第三項進行分組:

cut(ptime, "1 hour") 
#[1] 2004-04-07 23:00:00 2004-04-08 00:00:00 2004-04-08 00:00:00 

但是如果增加參數right=FALSE我們可以用"23:00"小時組是:

cut(ptime, "1 hour", right=TRUE) 
#[1] 2004-04-07 23:00:00 2004-04-07 23:00:00 2004-04-08 00:00:00 

我們可以指定邊緣案例的行爲。

編輯

隨着新數據的原始解決方案產生所需的輸出:

aggregate(precip['mm'], list(cut(precip$Datum, "1 hour")), sum, na.rm=TRUE) 
       Group.1 mm 
1 2004-03-08 23:00:00 5 
2 2004-03-09 00:00:00 6 
3 2004-03-09 01:00:00 5 
+0

您的解決方案成功刪除所有「NA」,但仍然沒有計算總和,每小時總和爲「0」。 –

+0

您是否嘗試過可重現的例子?如果您的數據不同,請指明位置。 –

+1

好的,非常感謝!感謝你的例子,我意識到,沉澱列沒有被正確載入作爲一個數字變量,因爲小數分隔符是','...德國人...! –

0

您可以使用dplyr計算像總和:

precip$hour <- strftime(precip$Datum,"%Y-%m-%d %H") 
library(dplyr) 
sum_hour <- precip %>% group_by(hour) %>% summarise(sum_hour = sum(mm,na.rm = T)) 
+0

感謝您的回答,但它們都沒有考慮我最後一次對@PierreLafortune的回答。期待您的解決方案! –

+0

你的意思是說,如果小時是4:00,它應該計算爲(3:00到4:00)嗎?如果是這樣,你將在0:00做什麼? – vdep

+0

是的,4點的總和應該是3:00-4:00,0點的總和應該是23:00-0:00的總和......現在這很棘手。 –