2011-03-04 69 views
13

我有以下格式的每小時的天氣數據:彙總每小時數據到每天聚集

Date,DBT 
01/01/2000 01:00,30 
01/01/2000 02:00,31 
01/01/2000 03:00,33 
... 
... 
12/31/2000 23:00,25 

我需要的是最大值,最小值,AVE這樣的每日彙總:

Date,MaxDBT,MinDBT,AveDBT 
01/01/2000,36,23,28 
01/02/2000,34,22,29 
01/03/2000,32,25,30 
... 
... 
12/31/2000,35,9,20 

如何在R中做到這一點?

+7

接下來的時間,提供數據表中的一個readible格式,例如使用dput()或提供可運行的代碼,我在我的答案顯示提供數據。 –

+0

閱讀了建議的答案之後,我想知道它是否只能使用base R來完成。 –

回答

18

1)這可以緊湊地利用動物園來完成:

L <- "Date,DBT 
01/01/2000 01:00,30 
01/01/2000 02:00,31 
01/01/2000 03:00,33 
12/31/2000 23:00,25" 

library(zoo) 
stat <- function(x) c(min = min(x), max = max(x), mean = mean(x)) 
z <- read.zoo(text = L, header = TRUE, sep = ",", format = "%m/%d/%Y", aggregate = stat) 

這給出:

> z 
      min max  mean 
2000-01-01 30 33 31.33333 
2000-12-31 25 25 25.00000 

2)這裏是僅使用核心R A溶液:

DF <- read.csv(text = L) 
DF$Date <- as.Date(DF$Date, "%m/%d/%Y") 
ag <- aggregate(DBT ~ Date, DF, stat) # same stat as in zoo solution 

最後一行給出:

> ag 
     Date DBT.min DBT.max DBT.mean 
1 2000-01-01 30.00000 33.00000 31.33333 
2 2000-12-31 25.00000 25.00000 25.00000 

編輯:(1)由於這首先出現在read.zootext=參數被添加到動物園包中。 (2)小的改進。

+0

@Grothendieck:+1我從來沒有意識到你可以通過在as.Date()中沒有指定它來放棄每小時的信息。 –

+0

我正在從手機看這個,但我敢打賭,'聚合'解決方案給出了一個列表列,你不能真正使用任何東西,除非你將所有東西都包裝進'do.call(cbind.data.frame,aggregate ... ' –

+0

它產生一個data.frame,它的第一列是ag $ Date,第二列是矩陣'ag $ DBT',它的列是「min」,「max」和「mean」。它很容易使用'read.zoo(ag)'轉換爲動物園系列。 –

5

使用strptime(),從plyr包trunc()ddply()

#Make the data 
ZZ <- textConnection("Date,DBT 
01/01/2000 01:00,30 
01/01/2000 02:00,31 
01/01/2000 03:00,33 
12/31/2000 23:00,25") 
dataframe <- read.csv(ZZ,header=T) 
close(ZZ) 

# Do the calculations 
dataframe$Date <- strptime(dataframe$Date,format="%m/%d/%Y %H:%M") 
dataframe$day <- trunc(dataframe$Date,"day") 

require(plyr) 

ddply(dataframe,.(day), 
     summarize, 
     aveDBT=mean(DBT), 
     maxDBT=max(DBT), 
     minDBT=min(DBT) 
) 

給出

  day aveDBT maxDBT minDBT 
1 2000-01-01 31.33333  33  30 
2 2000-12-31 25.00000  25  25 

澄清:

strptime根據格式的字符轉換爲日期。要了解如何指定格式,請參閱?strptime。然後trunc會將這些日期時間截斷爲指定的單位,即在這種情況下爲天。

ddply將在根據day對數據幀進行分割後評估數據幀中的函數summarizesummarize之後的所有內容都是傳遞給函數summarize的參數。

+1

你真的需要'summarize'的包裝嗎? –

+0

@Sacha:事實上,沒有必要這樣做,thx的糾正。這裏遲到了... –

2

還有一個很好的軟件包名爲HydroTSM。它使用動物園對象,並可以及時轉換爲其他聚合物

您的情況下的功能是subdaily2daily。您可以選擇彙總應基於最小/最大/平均值...

0

您可以使用此包的tidyquant包。該過程涉及使用tq_transmute函數返回使用xts聚合函數apply.daily修改的數據幀。我們將應用自定義stat_fun,它返回最小值,最大值和平均值。但是,您可以應用任何您想要的矢量函數,如quantile

library(tidyquant) 

df 
#> # A tibble: 4 x 2 
#>     Date DBT 
#>    <dttm> <dbl> 
#> 1 2000-01-01 01:00:00 30 
#> 2 2000-01-01 02:00:00 31 
#> 3 2000-01-01 03:00:00 33 
#> 4 2000-12-31 23:00:00 25 

stat_fun <- function(x) c(min = min(x), max = max(x), mean = mean(x)) 

df %>% 
    tq_transmute(select  = DBT, 
       mutate_fun = apply.daily, 
       FUN  = stat_fun) 
# A tibble: 2 x 4 
#>     Date min max  mean 
#>    <dttm> <dbl> <dbl> <dbl> 
#> 1 2000-01-01 03:00:00 30 33 31.33333 
#> 2 2000-12-31 23:00:00 25 25 25.00000