R:将文本持续时间 ("..d ..h ..m ..s") 转换为秒
R: convert text duration ("..d ..h ..m ..s") into seconds
正在尝试将以下持续时间转换为秒数
x <- "1005d 16h 09m 57s"
x1 <- "16h 09m 57s"
x2 <- "06h 09m 57s"
x3 <- "09m 57s"
x4 <- "57s"
我已经在 post .
中修改了 Jthorpe 的答案
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
但是,这仅适用于 x,不适用于 x1-x4。现在,我知道我可能可以使用 if 逻辑来解决这个问题,但是有更好的方法吗?
提前致谢。
我们可以用gsub
把space字符(\s+
)改成+
,然后我们就可以替换'd','h' , 'm', 's' 和 gsubfn
并循环输出并评估字符串。
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
数据
v1 <- c(x, x1, x2, x3, x4)
使用:
ifelse(is.na(your_exp),0)
因此,只要 na
是表达式的输出,它就会变成 0
。
例如:
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)
输出:(在duration_seconds <- seconds + 60*minutes + 60*60*hours + 24*60*60*days
之后)
> duration_seconds
[1] 58197
正在尝试将以下持续时间转换为秒数
x <- "1005d 16h 09m 57s"
x1 <- "16h 09m 57s"
x2 <- "06h 09m 57s"
x3 <- "09m 57s"
x4 <- "57s"
我已经在 post
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
但是,这仅适用于 x,不适用于 x1-x4。现在,我知道我可能可以使用 if 逻辑来解决这个问题,但是有更好的方法吗?
提前致谢。
我们可以用gsub
把space字符(\s+
)改成+
,然后我们就可以替换'd','h' , 'm', 's' 和 gsubfn
并循环输出并评估字符串。
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
数据
v1 <- c(x, x1, x2, x3, x4)
使用:
ifelse(is.na(your_exp),0)
因此,只要 na
是表达式的输出,它就会变成 0
。
例如:
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)
输出:(在duration_seconds <- seconds + 60*minutes + 60*60*hours + 24*60*60*days
之后)
> duration_seconds
[1] 58197