4

複数年にわたる1時間あたりの平均風速で満たされたデータセットがあります。「平均年」を作成したいと思います。この年では、1時間ごとに、複数年にわたるその時間の平均風速が計算されます。データセットを際限なくループせずにこれを行うにはどうすればよいですか?理想的には、データを1回ループして、各行について適切な月、日、および時間を抽出し、その行からの風速をデータフレーム内の適切な行に追加して、各月、日、および時間は収集されます。月、日、時間を抽出し、平均年のdata.frame全体をループして正しい行を見つけることなく、これを行うことは可能ですか?

いくつかのサンプルデータ:

data.multipleyears <- data.frame(
 DATETIME = c("2001-01-01 01:00:00", "2001-05-03 09:00:00", "2007-01-01 01:00:00", "2008-02-29 12:00:00"),
 Windspeed = c(10, 5, 8, 3)
)

これを次のようなデータフレームに集約したいと思います。

average.year <- data.frame(
 DATETIME = c("01-01 00:00:00", "01-01 01:00:00", ..., "12-31 23:00:00")
 Aggregate.Windspeed = (100, 80, ...)
)

そこから、平均などの計算を続けることができます。おそらくいくつかのコマンドを見落としていますが、このようなもの(擬似コード)の正しい構文は何でしょうか。

 for(i in 1:nrow(data.multipleyears) {
  average.year$Aggregate.Windspeed[
   where average.year$DATETIME(month, day, hour) == data.multipleyears$DATETIME[i](month, day, hour)]  <- average.year$Aggregate.Windspeed + data.multipleyears$Windspeed[i]
 }

またはそのようなもの。ヘルプをいただければ幸いです。

4

3 に答える 3

3

ddplyとplyrパッケージがあなたの親友になると私は予測しています:)。1〜10ミリ秒の1時間ごとのランダムな風速で30年のデータセットを作成しました。

begin_date = as.POSIXlt("1990-01-01", tz = "GMT")
# 30 year dataset
dat = data.frame(dt = begin_date + (0:(24*30*365)) * (3600))
dat = within(dat, {
  speed = runif(length(dt), 1, 10)
  unique_day = strftime(dt, "%d-%m")
})
> head(dat)
                   dt unique_day    speed
1 1990-01-01 00:00:00      01-01 7.054124
2 1990-01-01 01:00:00      01-01 2.202591
3 1990-01-01 02:00:00      01-01 4.111633
4 1990-01-01 03:00:00      01-01 2.687808
5 1990-01-01 04:00:00      01-01 8.643168
6 1990-01-01 05:00:00      01-01 5.499421

この30年間の毎日の正規化(30年の平均、この用語は気象学でよく使用されます)を計算するには、次のようにします。

library(plyr)
res = ddply(dat, .(unique_day), 
            summarise, mean_speed = mean(speed), .progress = "text")
> head(res)
  unique_day mean_speed
1      01-01   5.314061
2      01-02   5.677753
3      01-03   5.395054
4      01-04   5.236488
5      01-05   5.436896
6      01-06   5.544966

これは私の謙虚な2コアAMDでほんの数秒かかるので、データを1回だけ調べる必要はないと思います。異なる集計(月、季節など)に対するこれらのddply呼び出しの複数は、個別に実行できます。

于 2012-04-04T09:16:10.343 に答える
2

を使用substrして、必要な日付の一部を抽出してから、tapplyまたはを使用ddplyしてデータを集約できます。

tapply(
  data.multipleyears$Windspeed, 
  substr( data.multipleyears$DATETIME, 6, 19), 
  mean 
)
# 01-01 01:00:00 02-29 12:00:00 05-03 09:00:00 
#              9              3              5 

library(plyr)
ddply(
  data.multipleyears, 
  .(when=substr(DATETIME, 6, 19)), 
  summarize, 
  Windspeed=mean(Windspeed)
)
#             when Windspeed
# 1 01-01 01:00:00         9
# 2 02-29 12:00:00         3
# 3 05-03 09:00:00         5
于 2012-04-04T09:09:30.243 に答える
0

かなり古い投稿ですが、追加したいと思います。OpenairのtimeAverageも使えると思います。マニュアルには、timeAverage関数のオプションがさらにあります。

于 2017-07-01T21:18:02.163 に答える