【问题标题】:Consecutive event analysis in RR中的连续事件分析
【发布时间】:2017-01-19 23:41:47
【问题描述】:

我需要帮助解决这个问题。我检查了其他各种帖子,但我无法将其拼凑起来。我有数据,大约 100,000 条运动员和他们参加的训练项目的记录。我简化了数据,但这种方法适合整个数据集。

data.frame 的代码:

# 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

我需要标记每周完成至少 3 次游泳比赛的运动员 至少连续 2 周。

编辑:我没有正确考虑这一点。让我们把这变得更复杂一些。假设我们使用跑步周,即一组 7 天而不是日历周,从每个运动员的第一个游泳活动开始

更新:我还有另一个挑战,假设我只想寻找至少连续 10 天,每 5 天 3 次游泳事件的模式,任何地方在数据中。

谢谢

【问题讨论】:

    标签: r date events


    【解决方案1】:

    你可以做一个两步总结,首先计算每个运动员每周的游泳次数,然后检查是否有任何连续周的运动员超过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
    

    更新:要设置从第一次游泳开始的星期,使用which.max()找出第一个Swim出现的索引,然后减去这一天的所有天数得到日差,那么如果你做模(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
    

    【讨论】:

    • 我会接受您的回答,因为我没有正确指定。我将编辑问题并添加一个转折点。也许你有解决方案?
    • 我认为您的第二个解决方案无法正常工作。运动员 1 的第一次游泳是 02/01/2016,在接下来的 7 天内(包括第一次游泳),“他”游泳了 3 次。此后的 7 天内也有 3 次,因此它满足 7 天连续 2 次游泳 3 次的标准。代码返回 FALSE。
    • 它对我来说是真实的。我假设当您说运行周时,您并不意味着周重叠,对吗?还是一周又一周,只是不同运动员的起点不一样?
    • 你是对的,我没有检查天字段是日期。它有效,谢谢!是的,这是连续几周,每个运动员都从新开始。
    【解决方案2】:

    快速而肮脏的代码,但请检查它是否适用于您的数据集:

    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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-09
      • 2021-12-09
      • 1970-01-01
      • 2021-05-30
      • 2017-07-01
      • 1970-01-01
      • 2023-04-07
      相关资源
      最近更新 更多