2015-12-17 198 views
0

我有這個數據框,「數據」,包含大約每半小時收集一整年的數據,但有些日子只收集了幾小時的數據。如何計算每小時在R中收集的天氣變量數據的日平均值,中位數?

日期的格式爲:31.01.2010 00:30(都在同一個小區) 變量是:TemperaturehumidityPM10windspeed

第一個問題:我如何計算每天的手段,中位數,最大值,最小值,這些變量的值,因此我可以在進一步的分析中進行測試,例如使用GAM進行生存分析),而不是每小時/每半小時的數據?

顯然,計算出日平均/中位數應該被分配到相應的日期。

第二個問題DATES列同時包含日期和時間,在同一個單元格中由一個空格分隔。 在R,它的類型是'Factor',我不能做任何計算,因爲錯誤"dates" is missing出現。

我的猜測是,我需要先將它從Factor轉換爲date/time,這樣才能識別它,然後計算均值/中值。但我該怎麼做?

你能請註明這將是自變量/函數使用?

我認爲我已經解決了從'Factor'到POSIXlt的日期轉換:我使用了函數strptime(Data $ DATES,format =「%d。%m。%Y%H:%M」)和現在$日期是公認POSIXlt,格式爲「2010-01-01 00:00:00」 ......

但我仍然需要找到一個計算日平均或平均數或中位數或任何功能。

+0

我認爲我已經解決了日期從「要素」來POSIXlt轉換:我使用的功能strptime(Data $ DATES,format =「%d。%m。%Y%H:%M」),現在$ DATES被識別爲POSIXlt格式「2010-01-01 00:00:00」.... –

+0

刪除了'生存分析'和'gam'標記,因爲它們都不適用於這個問題。 –

回答

-1

有幾個部分的問題。在計算中位數統計之前,您需要按照數據框以使其具有適當的類型。

對於這些解釋,我會假設你有一個名爲dt數據幀。


1部分:轉換數據幀的數據類型

date factor to datetime StackOverflow

datetime POSIXct conversion StackOverflow

首先,你需要的Date列從factor類型轉換爲datetime類型。

dt$Date <- strptime(x = as.character(dt$Date), 
        format = "%d.%m.%Y %H:%M") 

dt$date_alt <- as.POSIXct(dt$date_alt) # convert the format of datetime to allow use with ddply 

然後,因爲我假設你想day-month-year中位數的統計,不包括時間,我們需要提取信息。你會想把它放在一個新的專欄來保存時間。

dt$date_alt <- strptime(x = as.character(dt$Date), 
     format = "%d.%m.%Y") 


第2部分:由某一特定領域

現在,我們有數據幀尋找我們想要的方式進行分組計算彙總統計,你可以計算出day-month-year分組的平均統計,在我們的案例中是date_alt列。

plyr包提供了這樣一個非常好的功能可按:ddply

library(plyr) # need this library for the plyr call 

summ <- ddply(dt, .(date_alt), summarize, 
       med_temp = median(!is.na(Temperature)), 
       mean_temp = mean(!is.na(Temperature)), # you can also calc mean if you want 
       med_humidity = median(!is.na(humidity)), 
       med_windspeed = median(!is.na(windspeed)) 
       # etc for the rest of your vars 
     ) 


打破ddply電話:

ddply cookbook explanation

ddply本質上是一個功能它對數據幀起作用。下面是參數的函數調用的細目:

  1. dt - 您想組列的名稱 - 要遍歷
  2. .(date_alt)數據框的名稱。 從概念上講,這會將數據框分割成一堆子數據框,其行由原始數據框中的行組成,這些行在圓括號中列出的列中共享相同的值。
  3. summarize - 這告訴你想在subdataframes
  4. med_temp = median(Temperature)以及所有類似的路線計算彙總統計的ddply通話 - 在結果數據幀中的列。這表示您希望新數據框有一個名爲med_temp的列,其中包含每個子數據框的median(Tempurature)結果。 請記住,而不是median你可以使用任何你想要的功能的聚合值。
+0

感謝xgord獲取有價值的信息。我已根據您的工具創建了日期替代列ction。我現在要研究ddply函數,並且會發布後者,因爲我需要一些時間來弄清楚正確的語法。 –

+0

xgord,我試過你的代碼;似乎有一個問題。在summ後得到輸出DATE_ALT med_pm10 mean_pm10 med_temp mean_temp 1 1 1 1 1有什麼想法可能會出錯?謝謝。 –

+0

我完全忘了它說的,但是像那裏只有一行......我不能重現錯誤。 –

0

首先,將您的時間序列轉換爲xts對象。 然後使用xts函數計算所需的數據,例如apply.daily() 請參見xts小插曲here

我覺得下面的代碼片段應該工作:

# Load library xts 
require(xts) 

# Create example dataframe 
datetime <- c('31.01.2010 00:30', '31.01.2010 00:31', '31.01.2010 10:32', '01.02.2010 10:00', '01.02.2010 11:03', '01.03.2011 08:09', '01.03.2011 21:00', '01.03.2011 22:00') 
value <- c(1.5, 2, 2.5, 7, 3.5, 9, 4.5, 7.5) 
df <- data.frame(datetime, value) 

# Create xts object 
df.xts <- as.xts(df[,2], order.by=as.Date(df[,1], format='%d.%m.%Y %H:%M')) 

# Daily mean 
d.mean <- apply.daily(df.xts, mean) 

# Daily median 
d.median <- apply.daily(df.xts, median) 

# Daily min 
d.min <- apply.daily(df.xts, min) 

# Daily max 
d.max <- apply.daily(df.xts, max) 

(或者,見RFiddle

+0

edouard,我檢查了xts vignette,並沒有發現任何關於中位數,手段或其他常見的統計數據;你確定這個軟件包可以做到嗎?無論如何,下面的選項,由xgord提出的作品,雖然。 –

+0

你好,我剛纔編輯了我的答案。請參閱上文。 (希望我得到了你以後的) – tagoma

相關問題