I have a character object with the time in hh:mm:ss-like format.
A given vector a for example purposes:
[1] "01|15|59" "1|47|16" "01|17|20" "1|32|34" "2|17|17"
I want to compute the number of seconds for each measurement.
For the first one you can simply do:
a <- as.numeric(strsplit(a, "|", fixed=TRUE)[[1]])
a[1]*60*60 a[2]*60 a[3]
I could use a loop to iterate through all of the elements of the char object, but ideally I would like to use an apply function. Not sure how to implement it.
CodePudding user response:
You can use sapply():
sapply(strsplit(a, "\\|"), \(x) sum(as.numeric(x) * 60^(2:0)))
# [1] 4559 6436 4640 5554 8237
or convert the time string to POSIXct and pass it to as.numeric() to get seconds:
as.numeric(strptime(paste('1970-01-01', a), '%F %H|%M|%S', 'UTC'))
# [1] 4559 6436 4640 5554 8237
difftime(strptime(a, '%H|%M|%S', 'UTC'), Sys.Date(), units = 'sec')
# Time differences in secs
# [1] 4559 6436 4640 5554 8237
Data
a <- c("01|15|59", "1|47|16", "01|17|20", "1|32|34", "2|17|17")
CodePudding user response:
Note that the | (vertical bar) needs to be escaped in your strsplit(). Otherwise it acts as a logical "or", resulting in a split on each character. Use [|] or \\|.
With a list object created by a <- strsplit(a, '[|]') You as could extract each list element with the `[[` function within sapply(). For example:
#Splits your vector on vertical pipe, with list output
a <- strsplit(a, '[|]')
#Apply extract function across list
3600*as.numeric( sapply(a,`[[`,1))
60*as.numeric( sapply(a,`[[`,2))
as.numeric( sapply(a,`[[`,3))
[1] 4559 6436 4640 5554 8237
