2011-03-04 4 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 

はMAX、MIN、このような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

次回は、dput使用して、例えば読める形式でデータテーブルを提供()または私は私の答えに示したように、データを提供して実行可能なコードを与えます。 –

+0

提案された解答を読んで、基底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を使用して解決する:

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 

EDIT:(1)これは最初に出現したので、へのtext=の引数が動物園パッケージに追加されました。 (2)マイナーな改善。

+0

@Grothendieck:+1私はあなたがas.Date()で指定しないことで毎時の情報を削除できることに気付かなかった。 –

+0

私は電話からこれを見ていますが、 'aggregate'ソリューションは' do.call(cbind.data.frame、aggregate ...)にすべてをラップしない限り、本当に何のためにも使用できないリスト列を与えます。 ' –

+0

最初のカラムが' ag $ Date 'で、その第2カラムが '' min "'、 '' max "'、 '' ''を意味する 'ag $ DBT'の行列であるdata.frameを生成します。それは 'read.zoo(ag)'を使って容易に動物園シリーズに変換します。 –

5

plyrパッケージからstrptime()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に従って分割した後にデータフレーム内の関数summarizeを評価します。 summarizeの後のすべては、関数summarizeに渡される引数です。

+1

'summarize'の周りに本当にラッパーが必要ですか? –

+0

@サチャ:確かに、その必要はありません、訂正のための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 
関連する問題