dplyr的过滤器不适用于rubridate的时间格式?

时间:2017-09-22 09:29:07

标签: r dplyr lubridate

在尝试回答this question时,我遇到了在filter - 期间列中使用dplyr - lubridat问题的问题。

示例数据:

df <- data.frame(time = ms(c('0:19','1:24','7:53','11:6')), value = 1:4)

使用:

filter(df, time > ms('5:00'))
# or:
filter(df, time > '5M 00S')

输出错误:

   time value
1   53S     3
2 1M 6S     4
Warning message:
In format.data.frame(x, digits = digits, na.encode = FALSE) :
  corrupt data frame: columns will be truncated or padded with NAs

应用this answer的解决方案也不会产生正确的输出:

> df %>% 
+   mutate(time = format(time, '%M:%S')) %>% 
+   filter(time > '05:00')
    time value
1    19S     1
2 1M 24S     2
3 7M 53S     3
4 11M 6S     4

但是使用vanilla R方法,可以工作:

> df[df$time > ms('5:00'), ]
    time value
3 7M 53S     3
4 11M 6S     4

> subset(df, time > ms('5:00'))
    time value
3 7M 53S     3
4 11M 6S     4

我的dplyr方法中有什么问题吗?

1 个答案:

答案 0 :(得分:0)

在尝试了很多不同的方法后,我得到了dplyr唯一的解决方案:

df %>% 
  mutate(time = as.numeric(time)) %>% 
  filter(time > as.numeric(ms('5:00'))) %>% 
  mutate(time = ms(paste0(floor(time/60),':',round((time/60 - floor(time/60))*60))))

这导致了良好的结果:

    time value
1 7M 53S     3
2 11M 6S     4