我有一个数据框,该数据框在列运行时中具有持续时间。
>df
value runtime info
1 129 4:52:05 sample1
3 145 1-5:12:43 sample2
我不确定如何正确地将这些持续时间转换为可排序的格式,例如使用dplyr排列。
如果使用以下命令,我会得到一个正确且可排序的持续时间,但不需要日期,并且该日期仅适用于%d-%H:%M:%S
,带有%H:%M:%S
的持续时间无法正确读取,并且会需要分开对待。
>strptime('1-5:12:43',format='%d-%H:%M:%S')
[1] "2018-12-01 5:12:43 CET"
lubridate
软件包中有一个duration
函数,但是无法指定持续时间的输入格式。
我想我可以提出一个聪明的regex语句,将运行时字符串分解为它的位以使用它,如下所示:
>duration(second = 3, minute = 1.5, hour = 2, day = 6)
但是,在此之前,也许还有其他更简单的建议?
答案 0 :(得分:1)
您也可以对字符串进行排序,但是字符串以及各个组件的宽度必须固定。但是,您将需要进行一些字符串操作。我看不到其他实用方法:
rtimes<-c('1-5:12:43','4:52:05','32:05','2-23:59:59')
sortable<-sapply(rtimes,function(str){
s<-as.numeric(
unlist(
strsplit(str,'-|:')
)
)
v<-c(rep.int(0,4-length(s)),s) # Padding the vector to ensure 4 components
paste(formatC(v,width = 2,flag = '0'),collapse = ' ') # PAdding the components to ensure 2 digits
},USE.NAMES = F)
sortable
[1] "01 05 12 43" "00 04 52 05" "00 00 32 05" "02 23 59 59"
sort(sortable)
"00 00 32 05" "00 04 52 05" "01 05 12 43" "02 23 59 59"
答案 1 :(得分:-1)
也许您可以在转换前将没有日值的运行时添加为“ 0-”?例如,通过执行以下操作:
df$runtime[!grepl("-", df$runtime)] <- paste0(
"0-", df$runtime[!grepl("-", df$runtime)])
之后,您可以对时间进行排序。