如何使用dplyr确定在指定天数内发生的事件数?

如何使用dplyr确定在指定天数内发生的事件数?,r,dplyr,tidyverse,R,Dplyr,Tidyverse,我有一个包含三列的TIBLE: runner-表示runner名称的字符串 比赛-表示比赛次数的数值 日期-比赛日期 我想添加第四列last45d,它表示与当前行的日期相比,过去45天内已运行的比赛数。我的reprex包括示例数据和我试图生成新行的尝试(我得到了所有NAs) 雷普雷克斯: 库(tidyverse) 图书馆(lubridate) 图书馆(reprex) df% 变异(last45=map_int(日期,~sum(介于数值(difftime(.x,date,units=“days”)

我有一个包含三列的TIBLE:

  • runner-表示runner名称的字符串
  • 比赛-表示比赛次数的数值
  • 日期-比赛日期
  • 我想添加第四列last45d,它表示与当前行的日期相比,过去45天内已运行的比赛数。我的reprex包括示例数据和我试图生成新行的尝试(我得到了所有NAs)

    雷普雷克斯:

    库(tidyverse)
    图书馆(lubridate)
    图书馆(reprex)
    df%
    变异(last45=map_int(日期,~sum(介于数值(difftime(.x,date,units=“days”)),1e-9,90))之间)%>%
    解组()
    df
    #>#tibble:18x7
    #>跑步者比赛日期表面距离最后45
    #>                        
    #>1 D.沃特尔6 2017-06-25 T 1400 1 3
    #>2 D.沃特尔5 2017-05-24 T 1400 2 3
    #>D.沃特尔4 2017-04-20 D 1600 2 3
    #>4 D.Wottle 3 2017-03-29 T 1400 1 2
    #>5 D.沃特尔2 2017-03-08 D 1500 2 1
    #>6 D.Wottle 1 2017-02-15 T 1400 3 0
    #>7 C.Hottle 6 2017-06-25 T 1400 2 3
    #>8 C.Hottle 5 2017-05-24 T 1400 3 3
    #>9 C.Hottle 4 2017-04-10 D 1600 3 3
    #>10 C.Hottle 3 2017-03-29 T 1400 2 2
    #>11 C.Hottle 2 2017-03-04 D 1500 1 1
    #>12 C.Hottle 1 2017-02-15 T 1400 1 0
    #>13 JJ.瓦特6 2017-06-15 T 1400 3 3
    #>14 JJ.瓦特5 2017-05-24 T 1400 1 4
    #>15 JJ.瓦特4 2017-04-28 D 1600 1 3
    #>16 JJ.瓦特3 2017-03-29 T 1400 3 2
    #>17 JJ.瓦特2 2017-03-01 D 1500 3 1
    #>18 JJ.瓦特1 2017-02-25 T 1400 2 0
    
    由(v0.3.0)于2020年5月13日创建

    这就是我希望最终结果的样子:

    df%>%
    分组人(跑步者)%>%
    变异(
    last45=map_int(日期,~sum(介于数值(difftime(.x,date,units=“days”)),1e-9,45)之间)
    #                ^^^^1                                       ^^^^2
    ) %>%
    解组()
    ##tibble:6 x 4
    #赛跑日期最后45
    #              
    #D.沃特尔6 2017-06-25 1
    #2 D.沃特尔5 2017-05-24 1
    #3 D.沃特尔4 2017-04-20 2
    #4 D.沃特尔3 2017-03-29 2
    #5 D.沃特尔2 2017-03-08 1
    #6 D.沃特尔1 2017-02-15 0
    
    注:

    • 日期的两个引用不同:“1”(在波浪线函数之外)一次转换为
      .x
      一个,因此
      .x
      始终是一个日期;“2”(在tilde函数中)是日期的原始列,因此将具有与当前运行程序的行相同的值;及

    • 我使用
      1e-9
      ,因为如果我使用
      0
      ,则始终考虑当天;通过使用
      1e-9
      (或一些同样小的数字),我们得到了有效的
      (上、下)
      边界,而不是
      dplyr::between
      默认值
      [上、下]
      (两侧闭合)


    谢谢。我需要做一些研究来了解变异函数的情况,但我很感激有机会学习。这是执行回归分析或在案例中使用的相同波浪函数吗?1e-9是什么?波浪函数主要是由tidyverse启用的速记。将
    ~
    视为
    函数(…)
    ,其中
    ..
    因其用户而异,例如
    函数(.x)
    用于
    映射
    ,以及
    函数(.x,.y)
    对于
    map2
    1e-9
    是一个非常小的数字的科学符号,正如我在注释中所讨论的,我使用它是因为
    dplyr::between
    的比较两端都是“闭合的”(在数学符号的意义上)。(可以用
    0.00000001
    替换
    1e-9
    )是的,查找
    &
    ,矢量化的“AND”内联运算符,记录在(该页面包括
    &
    &
    |
    |
    和其他一些)下。例如,
    ~sum(介于(…)&dist>=1400&pos==1L)
    。(我认为这可能行得通,但它会进行比严格必要的更多的比较。如果您使用“大”数据量(可能是100万行或更多)进行比较,那么可能会有一些方法使事情短路。从技术上讲,您不需要,因为它不需要对整个列进行逐行比较。这可能更简单(而且更有效)尽管如此,要做
    求和(map_lgl(date,~between(difftime(.x,date,units=“days”),1e-9,45))&dist>=1400&pos==1)
    ,其中dist和pos条件不在
    map
    的调用范围内。这更有意义吗?(事后看来,这对我来说是有意义的。)