Datetime 如何根据时间间隔条件分组和计数行

Datetime 如何根据时间间隔条件分组和计数行,datetime,group-by,count,dplyr,mutate,Datetime,Group By,Count,Dplyr,Mutate,在R中工作时,我有一个包含三个变量(ID、日期-时间和血压)的数据框,其中每一行都是一个人血压的测量值,以及相关的测量时间。每人有多行 我希望能够计算当前行/度量值(每人)前60分钟的行/度量值数量 下面是一些示例数据 my_df<-data.frame(ID=c("A","A","A","A","A","A","B","B","B","C","C","C","C","C"), Measured_DT_TM=as.POSIXct(c("2018-08-01 08:00:00","2018

在R中工作时,我有一个包含三个变量(ID、日期-时间和血压)的数据框,其中每一行都是一个人血压的测量值,以及相关的测量时间。每人有多行

我希望能够计算当前行/度量值(每人)前60分钟的行/度量值数量

下面是一些示例数据

my_df<-data.frame(ID=c("A","A","A","A","A","A","B","B","B","C","C","C","C","C"),
 Measured_DT_TM=as.POSIXct(c("2018-08-01 08:00:00","2018-08-01 08:20:00","2018-08-01 08:30:00","2018-08-01 08:35:00","2018-08-01 11:00:00","2018-08-01 11:30:00","2018-08-01 14:10:00","2018-08-01 15:40:00","2018-08-01 15:00:00","2018-08-01 13:00:00","2018-08-01 13:05:00","2018-08-01 13:30:00","2018-08-01 13:55:00","2018-08-01 14:40:00")),
 blood_pressure=c(115,115,120,130,140,130,120,125,125,150,160,130,130,131))
my_df%
排列(按组测量)%>%
变异(自第一次测量后的时间=difftime(测量的时间,第一次测量的时间,单位=c(“分钟”)),
自上一次测量以来的时间=difftime(测量的时间,滞后(测量的时间,n=1),单位=c(“分钟”))
我的_df_1
ID自第一次测量以来测量的时间自上一次测量以来测量的时间
1A 2018-08-01 08:00:00 115 0分钟不到一分钟
2018-08-01 08:20:00 115 20分钟20分钟
3 A 2018-08-01 08:30:00 120 30分钟10分钟
4a 2018-08-01 08:35:00 130 35分钟5分钟
5A 2018-08-01 11:00:00 140 180分钟145分钟
6a 2018-08-01 11:30:00 130 210分钟30分钟
7 B 2018-08-01 14:10:00 120分钟不到一分钟
8 B 2018-08-01 15:00:00 125 50分钟50分钟
9 B 2018-08-01 15:40:00 125 90分钟40分钟
10 C 2018-08-01 13:00:00 150分钟不到一分钟
11 C 2018-08-01 13:05:00 160 5分钟5分钟
12 C 2018-08-01 13:30:00 130 30分钟25分钟
13 C 2018-08-01 13:55:00 130 55分钟25分钟
14 C 2018-08-01 14:40:00 131 100分钟45分钟
我被困在这里,如何创建/变异一个新变量,从当前行(每人)开始计算前60分钟的行数。我想尝试创建no_u'measures_in_prev_60m'变量/列,如图所示

   ID    Measured_DT_TM         bp time_since_first_measure time_since_prev_measure measures_in_prev_60m
   <fct> <dttm>              <dbl> <drtn>                   <drtn>                                 <dbl>
 1 A     2018-08-01 08:00:00   115   0 mins                  NA mins                                  NA
 2 A     2018-08-01 08:20:00   115  20 mins                  20 mins                                   1
 3 A     2018-08-01 08:30:00   120  30 mins                  10 mins                                   2
 4 A     2018-08-01 08:35:00   130  35 mins                   5 mins                                   3
 5 A     2018-08-01 11:00:00   140 180 mins                 145 mins                                   0
 6 A     2018-08-01 11:30:00   130 210 mins                  30 mins                                   1
 7 B     2018-08-01 14:10:00   120   0 mins                  NA mins                                  NA
 8 B     2018-08-01 15:00:00   125  50 mins                  50 mins                                   1
 9 B     2018-08-01 15:40:00   125  90 mins                  40 mins                                   1
10 C     2018-08-01 13:00:00   150   0 mins                  NA mins                                  NA
11 C     2018-08-01 13:05:00   160   5 mins                   5 mins                                   1
12 C     2018-08-01 13:30:00   130  30 mins                  25 mins                                   2
13 C     2018-08-01 13:55:00   130  55 mins                  25 mins                                   3
14 C     2018-08-01 14:40:00   131 100 mins                  45 mins                                   1
ID测量值\u DT\u TM bp时间\u自\u第一次\u测量时间\u自\u上一次\u测量时间\u在\u上一次\u 60m
1a 2018-08-01 08:00:00 1150分钟不,不,不
2018-08-01 08:20:00 115 20分钟20分钟1
3 A 2018-08-01 08:30:00 120 30分钟10分钟2
4a 2018-08-01 08:35:00 130 35分钟5分钟3
5 A 2018-08-01 11:00:00 140 180分钟145分钟0
6a 2018-08-01 11:30:00 130 210分钟30分钟1
7 B 2018-08-01 14:10:00 120分钟不到不到
8 B 2018-08-01 15:00:00 125 50分钟50分钟1
9 B 2018-08-01 15:40:00 125 90分钟40分钟1
10 C 2018-08-01 13:00:00 150分钟不到不到
11 C 2018-08-01 13:05:00 160 5分钟5分钟1
12 C 2018-08-01 13:30:00 130 30分钟25分钟2
13 C 2018-08-01 13:55:00 130 55分钟25分钟3
14 C 2018-08-01 14:40:00 131100分钟45分钟1
有人能提供建议/帮助吗?
谢谢

这是使用列表列的好例子,列表列是
tidyverse
purr
包的一部分

我使用
mutate(y=list(x))
将每个ID的所有持续时间放入每一行,这将创建一个列表列。然后,我为每一行(截止点)创建标准。然后,我使用
pmap
测试每一个持续时间是否合格(在前60分钟内),它在每一行上运行并接受多个输入(即持续时间和截止时间集)。同时,对于每一行,我添加符合条件的元素

library(tidyverse,悄悄地=TRUE)
#>警告:程序包“tidyverse”是在R版本3.5.3下构建的
#>警告:包“ggplot2”是在R版本3.5.3下生成的
#>警告:包“tibble”是在R版本3.5.3下构建的
#>警告:程序包“tidyr”是在R版本3.5.3下构建的
#>警告:程序包“readr”是在R版本3.5.2下生成的
#>警告:包“purrr”是在R版本3.5.3下生成的
#>警告:包“dplyr”是在R版本3.5.3下构建的
#>警告:程序包“stringr”是在R版本3.5.2下生成的
#>警告:“forcats”软件包是在R版本3.5.2下构建的
我的_df%
分组依据(ID)%>%
排列(按组测量)%>%
变异(自第一次测量后的时间=difftime(测量的时间,第一次测量的时间,单位=c(“分钟”)),
自上一次测量以来的时间=difftime(测量的时间,滞后(测量的时间,n=1),单位=c(“分钟”))
#为提高可读性而采取的步骤
我的_df%>%
变异(所有度量值按度量值=列表(自第一次度量值起的时间),
截止时间=自第一次测量以来的时间-60,
检查pmap内的测量值(按ID列出所有测量值,自第一次测量以来的时间,截止值),约(…1<…2&…1>=…3)),
在上一个60米范围内没有测量值=地图(检查上一个60米范围内的测量值,总和))%>%
视图()
#结果为一行,没有额外的列
我的_df%>%
变异(上一次测量中无测量值=pmap(列表(自第一次测量以来的时间)、自第一次测量以来的时间、自第二次测量以来的时间
   ID    Measured_DT_TM         bp time_since_first_measure time_since_prev_measure measures_in_prev_60m
   <fct> <dttm>              <dbl> <drtn>                   <drtn>                                 <dbl>
 1 A     2018-08-01 08:00:00   115   0 mins                  NA mins                                  NA
 2 A     2018-08-01 08:20:00   115  20 mins                  20 mins                                   1
 3 A     2018-08-01 08:30:00   120  30 mins                  10 mins                                   2
 4 A     2018-08-01 08:35:00   130  35 mins                   5 mins                                   3
 5 A     2018-08-01 11:00:00   140 180 mins                 145 mins                                   0
 6 A     2018-08-01 11:30:00   130 210 mins                  30 mins                                   1
 7 B     2018-08-01 14:10:00   120   0 mins                  NA mins                                  NA
 8 B     2018-08-01 15:00:00   125  50 mins                  50 mins                                   1
 9 B     2018-08-01 15:40:00   125  90 mins                  40 mins                                   1
10 C     2018-08-01 13:00:00   150   0 mins                  NA mins                                  NA
11 C     2018-08-01 13:05:00   160   5 mins                   5 mins                                   1
12 C     2018-08-01 13:30:00   130  30 mins                  25 mins                                   2
13 C     2018-08-01 13:55:00   130  55 mins                  25 mins                                   3
14 C     2018-08-01 14:40:00   131 100 mins                  45 mins                                   1