2017-09-22 33 views
3

當試圖回答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

回答

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