R-如何格式化持续时间以使用dplyr进行正确排序

时间:2018-12-05 11:05:48

标签: r dplyr lubridate

我有一个数据框,该数据框在列运行时中具有持续时间。

>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)

但是,在此之前,也许还有其他更简单的建议?

2 个答案:

答案 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)])

之后,您可以对时间进行排序。