2017-09-23 42 views
0

我有一個多年的大型數據集,它有幾個變量,但我感興趣的是風速和日期時間。我想查找數據集中每天最大風速的時間。我有Posixct格式的小時數據,WS是偶數NAs的數字。下面是一個簡短的數據集,希望能夠說明我的觀點,但是我的dateTime並不是小時數據,但它提供了足夠的樣本。查找氣候數據中每日每日最大變量

dateTime <- seq(as.POSIXct("2011-01-01 00:00:00", tz = "GMT"), 
      as.POSIXct("2011-01-29 23:00:00", tz = "GMT"), 
      by = 60*24) 
WS <- sample(0:20,1798,rep=TRUE) 
WD <- sample(0:390,1798,rep=TRUE) 
Temp <- sample(0:40,1798,rep=TRUE) 
df <- data.frame(dateTime,WS,WD,Temp) 
df$WS[WS>15] <- NA 

我以前嘗試創建只是一個POSIX日期(減時間)的新列允許天的隔離,但是所有的我已經試過只用日期和WS(合計返回縮短數據幀的事情,分裂,xts)。總計只是一個沒有這樣做,但是,它給了我23:00:00作爲一個恆定的時間,這是不正確的。

我看過How to calculate daily means, medians, from weather variables data collected hourly in R?,https://stats.stackexchange.com/questions/7268/how-to-aggregate-by-minute-data-for-a-week-into-hourly-means等,但沒有人回答過這個問題,或者解決方案沒有得到理想的結果。

我需要將此分析的結果與另一個數據框進行比較,因此我需要數據集中每天發生最大風速時的實際時間。我有一種感覺,有一個簡單的解決方案,但是,這讓我感到沮喪。

回答

1

Dee問:「我想找出e最大風速的時間數據集中的一天。「其他答案已經計算出每天的最大值(WS),但不是發生在哪個小時。

所以我建議用dyplr以下解決方案:

library(dplyr) 
set.seed(12345) 
dateTime <- seq(as.POSIXct("2011-01-01 00:00:00", tz = "GMT"), 
       as.POSIXct("2011-01-29 23:00:00", tz = "GMT"), 
       by = 60*24) 
WS <- sample(0:20,1738,rep=TRUE) 
WD <- sample(0:390,1738,rep=TRUE) 
Temp <- sample(0:40,1738,rep=TRUE) 
df <- data.frame(dateTime,WS,WD,Temp) 
df$WS[WS>15] <- NA 

df %>% 
    group_by(Date = as.Date(dateTime)) %>% 
    mutate(Hour = hour(dateTime), 
     Hour_with_max_ws = Hour[which.max(WS)]) 

enter image description here

我想強調出來,如果有幾個小時,同一最大風速(在下面的例子:15) ,只有第一小時的最大時速(WS)纔會顯示,儘管在那一天的0,3,4,21和22時間達到了風速15!所以你可能需要一個更具體的邏輯。

enter image description here

+0

謝謝@塞繆爾。我希望因爲我的觀測數據已經從km h-1轉換爲m s-1,所以對於這個練習來說它是獨一無二的 – Dee

2

dplyr溶液可以是:

library(dplyr) 

df %>% 
    mutate(date = as.Date(dateTime)) %>% 
    left_join(
    df %>% 
     mutate(date = as.Date(dateTime)) %>% 
     group_by(date) %>% 
     summarise(max_ws = max(WS, na.rm = TRUE)) %>% 
     ungroup(), 
    by = "date" 
) %>% 
    select(-date) 

#     dateTime WS WD Temp max_ws 
# 1 2011-01-01 00:00:00 NA 313 2  15 
# 2 2011-01-01 00:24:00 7 376 1  15 
# 3 2011-01-01 00:48:00 3 28 28  15 
# 4 2011-01-01 01:12:00 15 262 24  15 
# 5 2011-01-01 01:36:00 1 149 34  15 
# 6 2011-01-01 02:00:00 4 319 33  15 
# 7 2011-01-01 02:24:00 15 280 22  15 
# 8 2011-01-01 02:48:00 NA 110 23  15 
# 9 2011-01-01 03:12:00 12 93 15  15 
# 10 2011-01-01 03:36:00 3 5 0  15 
+0

嗨@Kevin Arseneau我已經嘗試過的樣本數據,並得到一個錯誤'by'不能包含聯接列'date'這是從RHS丟失。有沒有解決這個問題? – Dee

+0

@Dee,檢查您正在運行的代碼。當我從你的問題中立即運行代碼後,我沒有錯誤。我認爲你一定是錯過了一些東西,我在'left_join'中的'mutate'語句爲右邊(RHS)創建了'date'列。 –

+0

Hi @Kevin Arseneau。我關閉了R並重新啓動。有用。如果所有其他都無法重新啓動幫助... :)謝謝! – Dee

0

爲了完整性的緣故(和因爲我喜歡的簡潔的代碼)這裏是一個 「單行」 使用data.table

library(data.table) 
setDT(df)[, max.ws := max(WS, na.rm = TRUE), by = as.IDate(dateTime)][] 
    dateTime WS WD Temp max.ws 
    1: 2011-01-01 00:00:00 NA 293 22  15 
    2: 2011-01-01 00:24:00 15 55 14  15 
    3: 2011-01-01 00:48:00 NA 186 24  15 
    4: 2011-01-01 01:12:00 4 300 22  15 
    5: 2011-01-01 01:36:00 0 120 36  15 
    ---          
1734: 2011-01-29 21:12:00 12 249 5  15 
1735: 2011-01-29 21:36:00 9 282 21  15 
1736: 2011-01-29 22:00:00 12 238 6  15 
1737: 2011-01-29 22:24:00 10 127 21  15 
1738: 2011-01-29 22:48:00 13 297 0  15 
+0

感謝您的短代碼。它看起來非常優雅。我會嘗試一下我的數據,看看結果如何。 – Dee