自第一次观察 R 以来的持续时间过滤数据集

Filter dataset for duration of time since first observation R

我将如何过滤数据集以删除超过特定持续时间的所有观测值和低于特定阈值的任何分组观测值 (focal_id)?我的问题在原则上与此类似 OP.

这是数据集的示例:

   focal_id time     first_time
 1     9128 08:40:30 08:40:30  
 2     9128 08:40:57 08:40:30  
 3     9128 08:41:27 08:40:30  
 4     9128 08:41:57 08:40:30  
 5     9128 08:42:27 08:40:30  
 6     9128 08:42:57 08:40:30  
 7     9128 08:43:27 08:40:30  
 8     9128 08:43:57 08:40:30  
 9     9128 08:44:17 08:40:30  
10     9128 08:44:29 08:40:30  
11     9128 08:44:29 08:40:30  
12     9128 08:45:06 08:40:30  
13     9128 08:45:28 08:40:30  
14     9128 08:46:32 08:40:30  
15     9128 08:46:58 08:40:30  
16     9128 08:47:28 08:40:30  
17     9128 08:47:28 08:40:30  
18     9128 08:48:00 08:40:30  
19     9128 08:48:30 08:40:30  
20     9128 08:48:31 08:40:30 
21     1022 06:20:02 06:20:02
22     1022 06:20:32 06:20:02
23     1022 06:21:00 06:20:02
24     1022 06:21:34 06:20:02

在上面的例子中,我想过滤掉 7 分 15 秒后(从第一次开始)的所有观察结果(即行)和少于 5 分 30 秒的任何 focal_id第一次观察(即行)的数量。

第一步,我使用 dplyr 执行以下操作:

filter_dataset<-dataset %>%
    group_by(focal_id) %>%
    arrange(time)  %>%
    mutate(first_time=min(time))

必须有一种方法来计算持续时间(然后我可以用它来过滤 focal_id 小于 5 分 30 秒的观察值),还可以过滤大于 7 分 15 秒的观察值 focal_id 持续时间超过 7 分 15 秒。

我尝试在 lubridate 包中工作,首先将我的时间设置为 hms,但这只返回秒数。我也尝试了 lubridate 包中的 duration 函数,但它返回了 NAs.

这是我想要的最终输出:

   focal_id     time   duration
1      9128 08:40:30   00:06:58
2      9128 08:40:57   00:06:58
3      9128 08:41:27   00:06:58
4      9128 08:41:57   00:06:58
5      9128 08:42:27   00:06:58
6      9128 08:42:57   00:06:58
7      9128 08:43:27   00:06:58
8      9128 08:43:57   00:06:58
9      9128 08:44:17   00:06:58
10     9128 08:44:29   00:06:58
11     9128 08:44:29   00:06:58
12     9128 08:45:06   00:06:58
13     9128 08:45:28   00:06:58
14     9128 08:46:32   00:06:58
15     9128 08:46:58   00:06:58
16     9128 08:47:28   00:06:58
17     9128 08:47:28   00:06:58

在下面的代码中,如果您想将 duration 保留为持续时间(而不是时间),请删除 as_hms().

library(tidyverse)
library(hms)

dataframe %>% 
  mutate(time=as_hms(time),
         first_time=as_hms(first_time)) %>% 
  filter(time - first_time < 7.25*60) %>%
  group_by(focal_id) %>%
  mutate(duration = as_hms(max(time - first_time))) %>% 
  filter(duration > 5.5*60)
  focal_id time     first_time duration
     <int> <time>   <time>     <time>  
 1    9128 08:40:30 08:40:30   06'58"  
 2    9128 08:40:57 08:40:30   06'58"  
 3    9128 08:41:27 08:40:30   06'58"  
 4    9128 08:41:57 08:40:30   06'58"  
 5    9128 08:42:27 08:40:30   06'58"  
 6    9128 08:42:57 08:40:30   06'58"  
 7    9128 08:43:27 08:40:30   06'58"  
 8    9128 08:43:57 08:40:30   06'58"  
 9    9128 08:44:17 08:40:30   06'58"  
10    9128 08:44:29 08:40:30   06'58"  
11    9128 08:44:29 08:40:30   06'58"  
12    9128 08:45:06 08:40:30   06'58"  
13    9128 08:45:28 08:40:30   06'58"  
14    9128 08:46:32 08:40:30   06'58"  
15    9128 08:46:58 08:40:30   06'58"  
16    9128 08:47:28 08:40:30   06'58"  
17    9128 08:47:28 08:40:30   06'58"