如何使用dplyr确定在指定天数内发生的事件数?
我有一个包含三列的TIBLE:如何使用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”)
库(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
始终是一个日期;“2”(在tilde函数中)是日期的原始列,因此将具有与当前运行程序的行相同的值;及.x
- 我使用
,因为如果我使用1e-9
,则始终考虑当天;通过使用0
(或一些同样小的数字),我们得到了有效的1e-9
边界,而不是(上、下)
默认值dplyr::between
(两侧闭合)[上、下]
~
视为函数(…)
,其中..
因其用户而异,例如函数(.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
的调用范围内。这更有意义吗?(事后看来,这对我来说是有意义的。)