R - Как отформатировать продолжительность для правильной сортировки с dplyr - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть фрейм данных, который имеет длительности во время выполнения столбца.

>df
       value    runtime         info
1        129    4:52:05      sample1
3        145  1-5:12:43      sample2

Я не уверен, как правильно преобразовать эти длительности в формат, который можно отсортировать, например, с помощью dplyrrange.

Если я использую следующее, я получаю несколько правильную и сортируемую длительность, но с датой, которая не нужна, а также это работает только для %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, но там невозможно указать формат ввода длительности.

Полагаю, я мог бы придумать умный оператор регулярного выражения, чтобы разложить строку времени выполнения на ее биты и использовать ее следующим образом:

>duration(second = 3, minute = 1.5, hour = 2, day = 6)

Однако, прежде чем я это сделаю, возможно, есть другие, проще предложения?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Вы также можете сортировать по строкам, но строка и отдельные компоненты должны иметь фиксированную ширину.Вам нужно будет выполнить некоторые манипуляции со строками.Я не вижу другого практического пути:

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"
0 голосов
/ 05 декабря 2018

Может быть, перед преобразованием можно добавить время выполнения, у которого нет значения дня, с "0-"?Например, выполнив:

df$runtime[!grepl("-", df$runtime)] <- paste0(
"0-", df$runtime[!grepl("-", df$runtime)])

После этого вы можете отсортировать по времени.

...