r - 如果我们有超过 60 分钟,如何转换冒号表示持续时间
问题描述
我被一些简单的东西困住了:我有分钟和秒的向量,例如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
而不是两个 NA,我希望命令返回类似62.9999 60.6666
. 在这一点上,我只是好奇是否有任何不使用正则表达式的解决方案。
解决方案
这里有一些替代方案。除了 (2) 他们不使用任何包。
1) sub提取数字,转换为数字并计算秒数。
60 * as.numeric(sub(":.*", "", myvec)) + as.numeric(sub(".*:", "", myvec))
## [1] 656 152 0 0 3779 3640 2783
2) strapply我们也可以strapply
在 gsubfn 中使用:
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 eval
名声不好,但如果你不介意使用它,那么它是这里最短的解决方案。
sapply(parse(text = paste0("60*", sub(":", "+", myvec))), eval)
## [1] 656 152 0 0 3779 3640 2783
推荐阅读
- php - 在 PHP 中使用 NodeJS 会话
- laravel - Multi Auth 去往不同的刀片。我怎样才能做到这一点?
- java - Automation tool in intelliJ
- machine-learning - 检查目标时出错:预期 dense_8 的形状为 (2,) 但得到的数组的形状为 (1,)
- java - JSR-303 共享继承对象验证
- amazon-web-services - AWS Lex 是否使用 AWS Transcribe 作为 ASR 进行快速识别?
- python - 避免循环 - 3d 数组
- c# - 如何确定返回 badrequest 的请求存在什么问题?
- html - 在这种情况下,当我增加border-right 时会发生什么?
- c - 为什么变量不递增?