【问题标题】:Filter dataset for duration of time since first observation R自第一次观察 R 以来的持续时间过滤数据集
【发布时间】:2020-06-29 19:10:10
【问题描述】:

我将如何过滤数据集以删除超过特定持续时间的所有观察结果以及低于特定阈值的任何分组观察结果 (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 的观察时间 7 分 15 秒的focal_id 的观察时间更长的持续时间超过 7 分 15 秒。

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

这是我想要的最终输出:

   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

【问题讨论】:

    标签: r filter group-by dplyr duration


    【解决方案1】:

    在下面的代码中,如果您想将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"
    

    【讨论】:

    • 据我所知有一个问题 - 为什么 hms::as_hmslubridate::hms 函数的行为如此不同?
    • 我还没有真正使用过lubridate::hms,我不确定它们为什么会有不同的行为。 lubridate::hms 将返回一个持续时间,如果您在具有 "09:30:02" 之类的值的字符向量上运行它。但是返回的对象是一个 S4 对象,并且与从hms::as_hms 返回的结构不同。我没有试图找出原因,但是当我在使用 lubridate::hms 创建的值上运行 max 函数时,它没有返回正确的持续时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 2020-09-27
    • 2020-02-04
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 2018-05-13
    相关资源
    最近更新 更多