Betel
Betel

Reputation: 161

How to filter rows based on time (hh:mm:ss) using dplyr in tidyversse in R?

This is my data

library(tidyverse)
a<-tribble(
   ~"Date", ~"Time", ~"Name", ~"Value",
   "2020-06-03",   "00:15:00",   "DR.RADHAKRISHNAN SALAI",   0.166,
   "2020-06-03",   "00:30:00", "DR.RADHAKRISHNAN SALAI",   0.867,
   "2020-06-03",   "00:45:00", "DR.RADHAKRISHNAN SALAI",   0.906,
   "2020-06-03",   "01:00:00", "DR.RADHAKRISHNAN SALAI",   0.677,
   "2020-06-03",   "01:15:00", "DR.RADHAKRISHNAN SALAI",   0.077
 )

Solution needed:

I wanted to filter all rows based on time (eg: between 00:15:00 and 00:45:00)

What i tried :

a%>%
filter(Time => hms::as.hms(00:15:00) | Time <= hms::as.hms(00:45:00) )

But i didnt end up with what i expected . Please help

Upvotes: 3

Views: 745

Answers (3)

Karthik S
Karthik S

Reputation: 11584

Does this work:

library(dplyr)
a %>% mutate(min = as.numeric(substr(Time, 1,2)) * 60 + as.numeric(substr(Time, 4,5))) %>% 
filter(between(min,15,45)) %>% select(-min)
# A tibble: 3 x 4
  Date       Time     Name                   Value
  <chr>      <chr>    <chr>                  <dbl>
1 2020-06-03 00:15:00 DR.RADHAKRISHNAN SALAI 0.166
2 2020-06-03 00:30:00 DR.RADHAKRISHNAN SALAI 0.867
3 2020-06-03 00:45:00 DR.RADHAKRISHNAN SALAI 0.906
> 

Upvotes: 2

Hugh
Hugh

Reputation: 16090

Use hour and minute as appropriate

library(lubridate)
library(tidyverse)

  
  a<-tribble(
    ~"Date", ~"Time", ~"Name", ~"Value",
    "2020-06-03",   "00:15:00",   "DR.RADHAKRISHNAN SALAI",   0.166,
    "2020-06-03",   "00:30:00", "DR.RADHAKRISHNAN SALAI",   0.867,
    "2020-06-03",   "00:45:00", "DR.RADHAKRISHNAN SALAI",   0.906,
    "2020-06-03",   "01:00:00", "DR.RADHAKRISHNAN SALAI",   0.677,
    "2020-06-03",   "01:15:00", "DR.RADHAKRISHNAN SALAI",   0.077
  )
  
  a %>%
    filter(hour(hms::as_hms(Time)) == 0,
           between(minute(hms::as_hms(Time)), 15, 45))
#> # A tibble: 3 x 4
#>   Date       Time     Name                   Value
#>   <chr>      <chr>    <chr>                  <dbl>
#> 1 2020-06-03 00:15:00 DR.RADHAKRISHNAN SALAI 0.166
#> 2 2020-06-03 00:30:00 DR.RADHAKRISHNAN SALAI 0.867
#> 3 2020-06-03 00:45:00 DR.RADHAKRISHNAN SALAI 0.906

Created on 2020-11-08 by the reprex package (v0.3.0)

Upvotes: 3

Ronak Shah
Ronak Shah

Reputation: 388817

Using base R :

subset(a, as.POSIXct(Time, format = "%T") >= as.POSIXct('00:15:00', format =  '%T') & 
          as.POSIXct(Time, format = "%T") <= as.POSIXct('00:45:00', format =  '%T'))

#   Date       Time     Name                   Value
#  <chr>      <chr>    <chr>                  <dbl>
#1 2020-06-03 00:15:00 DR.RADHAKRISHNAN SALAI 0.166
#2 2020-06-03 00:30:00 DR.RADHAKRISHNAN SALAI 0.867
#3 2020-06-03 00:45:00 DR.RADHAKRISHNAN SALAI 0.906

Upvotes: 2

Related Questions