2016-10-07 11 views
2

第2のデータセットの「イベント」として定義された間隔に基づいて、時系列データセットの多くのパラメータの手段を頻繁に計算する必要があります。効率的なdplyrは別のデータフレーム内の間隔に基づいて1つのデータフレームで要約する

以下のサンプルコードは、私の現在のアプローチを示しています。これはうまく動作します。

私のデータセットが増えていくので、もっと効率的な方法があるかどうか疑問に思っています。

dplyr/tidyverseの範囲内にとどまることが重要です(data.tableの方法は高く評価されますが、実際は役に立ちません)。

library(tidyverse) 

    #generate time series data 
    data <- bind_cols(
    data_frame(td=seq(from = as.POSIXct("2010-01-01 00:00"), 
           to = as.POSIXct("2010-12-31 23:59"), 
           by = 60)), 
    as_data_frame(replicate(20,runif(525600)))) 

    #generate events 
    events <- data_frame(
    event = as.character(1:669), 
    start_cet = seq(from = as.POSIXct("2010-01-01 00:00"), 
      to = as.POSIXct("2010-12-01 00:00"), 
      by = 43200), 
    stop_cet = seq(from = as.POSIXct("2010-01-01 02:00"), 
      to = as.POSIXct("2010-12-01 02:00"), 
      by = 43200) 
) 

    #calculate means of data columns within event intervals 
    system.time(
    means <- events %>% 
    rowwise() %>% 
    mutate(s = list(data %>% select(td) %>% filter(td >= start_cet & td < stop_cet))) %>% 
    unnest() %>% 
    select(event,td) %>% 
    left_join(.,data) %>% 
    group_by(event) %>% 
    summarise_at(vars(V1:V20),funs(mean=mean)) %>% 
    ungroup() 
) 
+0

は、あなたのためにパッケージXYZ内にありますか? – eddi

+0

FWIW、 'mutate'ステップでほとんどすべての関数時間が消費されているようです。 –

+0

**は**あなたの例では瞬時に実行されるはるかに効率的な方法ですが、あなたの任意の制約内にとどまることはありません。あなたは、シャベルの代わりにハンマーを使って穴を掘りたい。それで幸運。 – eddi

答えて

1

ここでOPサンプルのために実行するのに約10ミリ秒を要しdata.tablelatest devel(1.9.7+)バージョン使用して、それを行うための効率的な方法です:なぜそれが滞在すること」が重要である

library(data.table) 
setDT(data); setDT(events) 

data[events, on = .(td >= start_cet, td <= stop_cet), lapply(.SD, mean), by = .EACHI] 
+0

ありがとうございます。将来的には役に立つかもしれない... – user3460194

関連する問題