1

I am having troubles understanding why the code below behaves how it behaves. Basically, the filter seems to be applied but then fails to work in subsequent calls.

> library(dplyr)
> library(lubridate)
> 
> md1 <- data.frame(no = 1:4, time = c("12:30:00", "13:30:00", "14:30:00", "15:30:00"))
> md1$time <- hms(md1$time)
> md1
  no       time
1  1 12H 30M 0S
2  2 13H 30M 0S
3  3 14H 30M 0S
4  4 15H 30M 0S
> md2 <- filter(md1, hour(time)<14)
> md2
  no       time
1  1 12H 30M 0S
2  2 13H 30M 0S
> hour(md2$time)
[1] 12 13 14 15

while I would like / expect to receive [1] 12 13 in the last call

Any suggestions welcome. It behaves the same in 3.3.1 and 3.4.0 versions of R (Windows 7)

coffeinjunky
  • 11,254
  • 39
  • 57
emJay
  • 13
  • 2
  • 2
    seems to be related to https://github.com/tidyverse/dplyr/issues/2520 – Janna Maas May 08 '17 at 16:56
  • There's some kind of bug with `filter`; it gives me a warning that the data.frame is corrupt. It works fine with base subsetting, though: `md2 <- md1[hour(md2$time) < 14, ]` – alistaire May 08 '17 at 16:58

1 Answers1

1
 md2 <- md1 %>%  
 + mutate(time = format(time, format="%H:%M:%S")) %>%
 + filter(time < "14:00:00")

 md2

 no       time
 1  1 12H 30M 0S
 2  2 13H 30M 0S

md2$time
[1] "12H 30M 0S" "13H 30M 0S"

If you want only the hour

hour(hms(as.character(md2$time)))
[1] 12 13
user2510479
  • 1,528
  • 13
  • 17