dplyr的过滤器不能处理lubridate的时间格式吗?
问题描述:
当试图回答this question时,我遇到了使用filter
从dplyr
-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
方法做错了什么?
答
尝试了很多不同的方法后,我收到了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
只是为了澄清,问题是,正确行是选择(3和4)但时间列已被更改? – Axeman
是的,我试过了,它似乎是交换M和S – amrrs
它可以有什么与t and和限制在其中定义一个日期结构? – Sotos