2

測定変数 x の時系列データを含むデータ フレーム「データ」があるとします。

     date            x
2009/10/01 00:00    10
2009/10/01 01:00    11
2009/10/01 02:00    12
2009/10/01 03:00    13
2009/10/01 04:00    14
2009/10/01 05:00    15
2009/10/01 06:00    16
2009/10/01 07:00    17
2009/10/01 08:00    18
2009/10/01 09:00    19
2009/10/01 10:00    20
2009/10/01 11:00    21
2009/10/01 12:00    22
2009/10/01 13:00    23
2009/10/01 14:00    24
2009/10/01 15:00    25
2009/10/01 16:00    26
2009/10/01 17:00    27
2009/10/01 18:00    28
2009/10/01 19:00    29
2009/10/01 20:00    30
2009/10/01 21:00    31
2009/10/01 22:00    32
2009/10/01 23:00    33
2009/10/02 00:00    34
...

開始日と終了日で定義された異なる期間を持つ別のデータ フレーム「イベント」:

id        start              stop
1   2009/10/01 02:00    2009/10/01 04:00
2   2009/10/01 07:00    2009/10/01 10:00
3   2009/10/01 08:00    2009/10/01 20:00
...

ここで、次のようなさまざまなイベント内の x の平均値の表を取得したいと思います。

id  mean.x
1   13
2   18.5
3   25.5

データベースでは、次のような単純な SQL ステートメントを実行します。

SELECT a.id, avg(b.x) 
FROM events as a, data as b 
WHERE b.date between a.start and a.stop 
GROUP BY a.id 

Rでこのような平均化をどのように行うことができるのだろうか? データに id 列があり、どのデータ ポイントがどのイベントに含まれるかを示す場合、「集計」を使用できますが、この列を作成する方法が見つかりません...

どんな提案でも大歓迎です。

シン

編集:

dput(データ):

structure(list(date = structure(c(1254348000, 1254351600, 1254355200, 
1254358800, 1254362400, 1254366000, 1254369600, 1254373200, 1254376800, 
1254380400, 1254384000, 1254387600, 1254391200, 1254394800, 1254398400, 
1254402000, 1254405600, 1254409200, 1254412800, 1254416400, 1254420000, 
1254423600, 1254427200, 1254430800, 1254434400), class = c("POSIXct", 
"POSIXt"), tzone = "Europe/Berlin"), x = 10:34), .Names = c("date", 
"x"), row.names = c(NA, -25L), class = "data.frame")

dput(イベント):

structure(list(id = 1:3, start = structure(c(1254355200, 1254373200, 
1254387600), class = c("POSIXct", "POSIXt"), tzone = "Europe/Berlin"), 
    stop = structure(c(1254362400, 1254384000, 1254420000), class = c("POSIXct", 
    "POSIXt"), tzone = "Europe/Berlin")), .Names = c("id", "start", 
"stop"), row.names = c(NA, -3L), class = "data.frame")

編集2:

dput (イベント 2):

structure(list(id = structure(1:3, .Label = c("AGH", "TRG", "ZUH"
), class = "factor"), start = structure(c(1254355200, 1254358800, 
1254358800), class = c("POSIXct", "POSIXt"), tzone = "Europe/Berlin"), 
    stop = structure(c(1254362400, 1254384000, 1254420000), class = c("POSIXct", 
    "POSIXt"), tzone = "Europe/Berlin")), .Names = c("id", "start", 
"stop"), row.names = c(NA, -3L), class = "data.frame")
4

2 に答える 2

4

これを試して:

library(sqldf)
sqldf("
    SELECT a.id, avg(b.x) 
    FROM events as a, data as b 
    WHERE b.date between a.start and a.stop 
    GROUP BY a.id 
")
于 2012-06-20T18:18:34.957 に答える
1

各日付がどのイベントに該当するかのリストを次のように取得できます。

event.indices = sapply(data$date, function(d) which(d >= events$start & d <= events$stop))

問題は、それらがどのイベントにも該当しない場合、それらのいくつかがnullになることです。したがって、それらをNAに置き換えれば、次のようになります。

event.indices = sapply(event.indices, function(i) ifelse(is.null(i), NA, i))

あなたのデータでは、これは次のとおりです。

  [1] NA NA  1  1  1 NA NA  2  2  2  2  3  3  3  3  3  3  3  3  3  3 NA NA NA NA

次に、それを元のデータフレームに追加し、最初に提案したとおりに集計を使用できます。

注:これは、各日付が最大で1つのイベントに分類されることが保証されていることを前提としています。イベントが重複している場合(最後のイベントが終了したときに正確に開始した場合でも)、複数のイベントに該当する日付をどのように処理するかを決定し、適切に調整する必要があります。

于 2012-06-20T16:24:58.023 に答える