2017-02-28 14 views
0

Upfrontの謝罪これが尋ねられた場合、私は一日中検索しており、私の問題に適用できる回答は見つかりませんでした。dplyrを使用してグループ化し、繰り返しフィルタでまとめます

私の以前の方法(forループ)があまりにも非効率であったため、dplyr(とco。)を使用してこの問題を解決しようとしています。私は、グループ内のサイトで、イベント時間のデータセットを持っています。シーケンスに沿って移動するウィンドウ内で発生するイベントの数(および割合)を要約したいと思います。

# Example data 
set.seed(1) 
sites = rep(letters[1:10],10) 
groups = c('red','blue','green','yellow') 
times = round(runif(length(sites),1,100)) 

timePeriod = seq(1,100) 

# Example dataframe 
df = data.frame(site = sites, 
       group = rep(groups,length(sites)/length(groups)), 
       time = times) 

これは、所与の移動ウィンドウ内で時間(イベント)を含む各グループからのサイトの数を要約する試みです。 目的は、ベクトルtimePeriodの各要素を移動し、各グループ内で発生したイベントの数をtimePeriod[i] +/- half-windowで要約することです。最終的にそれらを、例えば各グループのための列と各時間ステップの行とを有するデータフレームに格納することが理想的である。

df %>% 
filter(time > timePeriod[i]-25 & time < timePeriod[i]+25) %>% 
group_by(group) %>% 
summarise(count = n()) 

どのように私の時間シーケンスをループせずに、個々のグループごとにサマリーテーブルを保存することができますか?ありがとう!

答えて

0

lapplydplyrを組み合わせると、これまでの作業に近い次のことができます。

lapply(timePeriod, function(i){ 
    df %>% 
    filter(time > (i - 25) & time < (i + 25)) %>% 
    group_by(group) %>% 
    summarise(count = n()) %>% 
    mutate(step = i) 
}) %>% 
    bind_rows() 
+0

大変、ありがとう@Juan Bosco!適用ファミリの実装方法、偉大な例をまだ学習しています。 –

関連する問題