dplyr的过滤器不能处理lubridate的时间格式吗?

问题描述:

当试图回答this question时,我遇到了使用filterdplyr -package到lubridat -period列的问题。dplyr的过滤器不能处理lubridate的时间格式吗?

实施例的数据:

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 

但使用香草[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方法做错了什么?

+0

只是为了澄清,问题是,正确行是选择(3和4)但时间列已被更改? – Axeman

+0

是的,我试过了,它似乎是交换M和S – amrrs

+0

它可以有什么与t and和限制在其中定义一个日期结构? – Sotos

尝试了很多不同的方法后,我收到了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