Первое решение использует strapply
в пакете gsubfn и преобразуется в дни, например, 1 час - это 1/24 дня.Второе решение преобразуется в выражение R, которое вычисляет количество дней и затем оценивает его.
library(gsubfn)
library(chron)
unit2days <- function(d, u)
as.numeric(d) * switch(tolower(u), s = 1, m = 60, h = 3600)/(24 * 3600)
transform.span.to.time <- function(x)
sapply(strapply(x, "(\\d+) *(\\w)", unit2days), sum)
Вот второе решение:
library(chron)
transform.span.to.time2 <- function(x) {
x <- paste(x, 0)
x <- sub("h\\w*", "*3600+", x, ignore.case = TRUE)
x <- sub("m\\w*", "*60+", x, ignore.case = TRUE)
x <- sub("s\\w*", "+", x, ignore.case = TRUE)
unname(sapply(x, function(x) eval(parse(text = x)))/(24*3600))
}
Тесты:
> x <- c("12 hours 3 min 1 sec", "22h", "18 MINUTES 23 SECONDS")
>
> times(transform.span.to.time(x))
[1] 12:03:01 22:00:00 00:18:23
>
> times(transform.span.to.time2(x))
[1] 12:03:01 22:00:00 00:18:23