2017-01-19 7 views
1

この問題で助けが必要です。私は様々な他の投稿をチェックしましたが、一緒にまとめていくことはできません。私は参加したアスリートとトレーニングイベントの約10万レコードのデータを持っています。私はデータを簡略化しましたが、そのアプローチはデータセット全体に適しています。 data.frameため連続事象分析R

コード:

# Fictitious data 
days <- seq(as.Date("2016/01/01"), as.Date("2016/01/28"), "days") 
events <- c("Run","Swim","Swim","Cycle","Rest","Gym","Swim","Run", 
    "Cycle","Run","Swim","Swim","Run","Swim","Cycle","Rest","Gym", 
    "Swim","Swim","Swim","Run","Swim","Run","Gym","Rest","Gym", 
    "Cycle","Swim") 
my.data <- data.frame(athlete = 1, days,events) 
# Note - This data repeats for many participants, but I did not include more than 1 

私は、少なくとも2週連続週 あたり少なくとも3つの水泳イベントを完了フラグ選手に必要です。

:私はこれを正しく考えなかった。これをもう少し複雑にしましょう。週を走っている、つまり暦年ではなく7日間のグループで働いているとします。から始めてスイムイベントが各アスリートのために働いています。

更新:私はまだ別の課題を持っている、のは私だけで、少なくとも10日間連続して5日間あたり3つの水泳イベントのパターンのデータでどこでもを見てみたいとしましょう。

おかげ

答えて

3

あなたは、2段階の集約を行い、まず、それぞれのアスリートのために毎週のために泳ぐの数を計算して、アスリートのためのより多くの次の3人の泳ぎを持っているあらゆる週連続があるかどうかを確認することができます

library(dplyr) 
library(lubridate) 
my.data %>% 
     arrange(days) %>% 
     group_by(athlete, w = week(days)) %>% 
     summarise(n_swim = sum(events == "Swim")) %>% 
     group_by(athlete) %>% 
     summarise(flag = any(diff(w[n_swim >= 3]) == 1)) 

# A tibble: 1 x 2 
# athlete flag 
# <dbl> <lgl> 
#1  1 TRUE 

更新:、最初のスイムから始まる週を設定する場所最初のSwim表示されたインデックスを見つけるためにwhich.max()を使用し、目ですべての日を減算します日差を取得するための日です、そして、あなたはモジュロ(7)の計算を行う場合には、週番号は、この日から開始します:

my.data %>% 
     arrange(days) %>% group_by(athlete) %>% 
     mutate(Swim = events == "Swim", 
       w = as.integer(days - days[which.max(Swim)]) %/% 7) %>% 
     # the first swim day is set as zero, a modulo of 7 will give week number 
     # starting from this day    

     group_by(w, add = TRUE) %>% 
     summarise(n_swim = sum(Swim)) %>% 
     group_by(athlete) %>% 
     summarise(flag = any(diff(w[n_swim >= 3]) == 1)) 

# A tibble: 1 x 2 
# athlete flag 
# <dbl> <lgl> 
#1  1 TRUE 
+0

これを正しく指定していないので、私はあなたの答えを受け入れます。私は問題を編集してそれにひねりを加えるつもりです。多分あなたは解決策を持っていますか? – RUser

+0

私はあなたの2番目のソリューションが正しく動作するとは思わない。アスリート1の最初の泳ぎは02/01/2016で、次の7日間(最初の泳ぎを含む)、「彼」は3回泳ぎます。それ以降の7日間で3回も同様に、3日間の2日間の連続7日間の基準を満たす。コードはFALSEを返します。 – RUser

+0

それは私のために真実を返す。あなたが週を走っていると言ったら、週が重なっているわけではありませんよね?まだ1週間後ですが、スタート地点はスポーツ選手ごとに違いますか? – Psidom

0

迅速かつ汚いコードが、それはあなたのデータセットのために働くかどうかを確認:

library(tidyverse) 
library(lubridate) 

df %>% 
    mutate(weeknum=week(days)) %>% 
    group_by(athlete,weeknum) %>% 
    filter(events=='Swim') %>% 
    summarise(n=n()) %>% 
    mutate(gt_3=as.numeric(n>=3), 
      x=gt_3-lag(gt_3,1), 
      flag=x==0) %>% 
    filter(flag==T) %>% 
    select(athlete) %>% 
    distinct()