【问题标题】:How can I select cases based on time data?如何根据时间数据选择案例?
【发布时间】:2020-09-11 03:55:02
【问题描述】:

我是使用 R 的新手,我偶然发现了一些我自己似乎无法解决的问题。我不知道如何根据时间单位选择案例。

我想选择Time_D - Time_A 等于或大于 5 秒的情况(对于同一个人)。

例如,我的数据框包含以下数据:

+-------------------+--------------+---------------+
|   | Individual    | Time_A       | Time_D        |  
+-------------------+--------------+---------------+
| 1 | A             | 09:21:27     | 09:21:28      |     
| 2 | A             | 09:21:29     | 09:21:40      |   
| 3 | A             | 09:21:30     | 09:21:36      |   
| 4 | B             | 09:32:14     | 09:32:23      | 
| 5 | B             | 09:32:18     | 09:32:22      | 
+-------------------+--------------+---------------+

而且我只想选择Time_D - Time_A >= 5 秒的情况来获得以下数据框:

+----------------+------------+-------------+
|   | Individual | Time_A     | Time_D      |   
+----------------+------------+-------------+
| 2 | A          | 09:21:29   | 09:21:40    |    
| 3 | A          | 09:21:30   | 09:21:36    | 
| 4 | B          | 09:32:14   | 09:32:23    | 
+----------------+------------+-------------+

我已经编码了时间:

DT <- as.data.table(df3)[, Time_A := as.ITime(Time_A)][, Time_D := as.ITime(Time_D)]

【问题讨论】:

    标签: r


    【解决方案1】:

    将列转换为 ITime 后,您可以减去 Time_D - Time_A 并保留差值大于 5 的行。

    library(data.table)
    cols <- c('Time_A', 'Time_D')
    setDT(df)[, (cols) := lapply(.SD, as.ITime), .SDcols = cols]
    df[(Time_D - Time_A) >= 5]
    
    #   Individual   Time_A   Time_D
    #1:          A 09:21:29 09:21:40
    #2:          A 09:21:30 09:21:36
    #3:          B 09:32:14 09:32:23
    

    在基础 R 中,您可以使用 as.POSIXct 来执行此操作。

    subset(df, as.POSIXct(Time_D, format = '%T') - 
               as.POSIXct(Time_A, format = '%T') >= 5)
    

    【讨论】:

      【解决方案2】:

      我们可以使用tidyverse

      library(dplyr)
      library(lubridate)
      df1 %>% 
         filter(period_to_seconds(hms(Time_D)) - period_to_seconds(hms(Time_A)) >=5)
      #  Individual   Time_A   Time_D
      #1          A 09:21:29 09:21:40
      #2          A 09:21:30 09:21:36
      #3          B 09:32:14 09:32:23
      

      数据

      df1 <- structure(list(Individual = c("A", "A", "A", "B", "B"), 
            Time_A = c("09:21:27", 
      "09:21:29", "09:21:30", "09:32:14", "09:32:18"), Time_D = c("09:21:28", 
      "09:21:40", "09:21:36", "09:32:23", "09:32:22")), class = "data.frame", 
      row.names = c(NA, 
      -5L))
      

      【讨论】:

        猜你喜欢
        • 2014-12-12
        • 1970-01-01
        • 1970-01-01
        • 2014-05-09
        • 1970-01-01
        • 2016-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多