如果我们超过60分钟,如何转换冒号表示法的持续时间

时间:2018-11-12 16:39:13

标签: r duration difftime

我坚持简单的事情:我有分钟和秒的向量,例如myvec=c("10:56","2:32","0:00","0:00","62:59","60:40","46:23"):前面的数字表示分钟,冒号后面的数字表示秒。

我尝试了

difftime(myvec,format='%M:%S')
Error in difftime(myvec, format = "%M:%S") : 
  unused argument (format = "%M:%S")

但是我的问题似乎是几分钟的值大于60。我有点惊讶,无法想到任何简单的解决方案。也许我只是误解了difftime文档。抱歉,如果这样做会造成重复。

编辑:

由于有人问:

as.difftime(myvec,format='%M:%S',units='mins')
10.933333  2.533333  0.000000  0.000000        NA        NA 46.383333

我希望命令返回两个62.9999 60.6666之类的内容,而不是两个NA。此时,我很好奇,如果不使用正则表达式,是否有解决方案。

1 个答案:

答案 0 :(得分:3)

这里有一些替代方法。除了(2)以外,它们不使用任何程序包。

1)子:提取数字,转换为数字并计算秒数。

60 * as.numeric(sub(":.*", "", myvec)) + as.numeric(sub(".*:", "", myvec))
## [1]  656  152    0    0 3779 3640 2783

2)绑我们也可以在gsubfn中使用strapply

library(gsubfn)
strapply(myvec, "(.+):(.+)", ~ 60 * as.numeric(min) + as.numeric(sec), simplify = TRUE)
## [1]  656  152    0    0 3779 3640 2783

3)扫描另一个解决方案可以基于扫描和矩阵乘法:

c(c(60, 1) %*% matrix(scan(text = myvec, sep = ":", quiet = TRUE), 2))
## [1]  656  152    0    0 3779 3640 2783

4)评估 eval的信誉不好,但如果您不介意使用它,则它是此处解决方案中最短的一种。

sapply(parse(text = paste0("60*", sub(":", "+", myvec))), eval)
## [1]  656  152    0    0 3779 3640 2783