R: convert text duration (“..d ..h ..m ..s”) into seconds

房东的猫 提交于 2019-12-13 02:31:35

问题


Trying to convert the following durations into seconds

x <- "1005d 16h 09m 57s"
x1 <- "16h 09m 57s"
x2 <- "06h 09m 57s"
x3 <- "09m 57s"
x4 <- "57s"

I've modified the answer from Jthorpe in this post Convert factor of format Hh Mm Ss to time duration.

days <- as.numeric(gsub('^*([0-9]+)d.*$','\\1',x3))
hours <- as.numeric(gsub('^.*([0-9][0-9])h.*$','\\1',x3))
minutes <- as.numeric(gsub('^.*([0-9][0-9])m.*$','\\1',x4))
seconds <- as.numeric(gsub('^.*([0-9][0-9])s.*$','\\1',x4))
duration_seconds <- seconds + 60*minutes + 60*60*hours + 24*60*60*days

However, this is only working with x, but not x1-x4. Now, I know I can probably use if logic to get around the issue, but is there a better way?

Thanks in advance.


回答1:


We can change the space character (\\s+) with + using gsub, then we can replace 'd', 'h', 'm', 's' with gsubfn and loop through the output and evaluate the string.

library(gsubfn)
v2 <- gsubfn("[a-z]", list(d="*24*60*60", h = "*60*60", m = "*60",
        s="*1"), gsub("\\s+", "+", v1))
unname(sapply(v2, function(x) eval(parse(text=x))))
#[1] 86890197    58197    22197      597       57

data

 v1 <- c(x, x1, x2, x3, x4)



回答2:


Use:

ifelse(is.na(your_exp),0)

So that whenever na is the output of your expression it becomes 0.

Eg:

days <- ifelse(is.na(as.numeric(gsub('^*([0-9]+)d.*$','\\1',x1))),0)
hours <- ifelse(is.na(as.numeric(gsub('^.*([0-9][0-9])h.*$','\\1',x1))),0)
minutes <- ifelse(is.na(as.numeric(gsub('^.*([0-9][0-9])m.*$','\\1',x1))),0)
seconds <- ifelse(is.na(as.numeric(gsub('^.*([0-9][0-9])s.*$','\\1',x1))),0)

Output:(after duration_seconds <- seconds + 60*minutes + 60*60*hours + 24*60*60*days)

> duration_seconds
[1] 58197


来源:https://stackoverflow.com/questions/37019186/r-convert-text-duration-d-h-m-s-into-seconds

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!