如果超过 60 分钟,如何转换冒号表示持续时间
How to convert colon notation duration time if we have more than 60 minutes
我被一些简单的东西困住了:我有分和秒的矢量,例如 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
我希望命令 return 而不是两个 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 我们也可以在 gsubfn 中使用 strapply
:
library(gsubfn)
strapply(myvec, "(.+):(.+)", ~ 60 * as.numeric(min) + as.numeric(sec), simplify = TRUE)
## [1] 656 152 0 0 3779 3640 2783
3) scan 另一种方案可以基于scan和矩阵乘法:
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
我被一些简单的东西困住了:我有分和秒的矢量,例如 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
我希望命令 return 而不是两个 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 我们也可以在 gsubfn 中使用 strapply
:
library(gsubfn)
strapply(myvec, "(.+):(.+)", ~ 60 * as.numeric(min) + as.numeric(sec), simplify = TRUE)
## [1] 656 152 0 0 3779 3640 2783
3) scan 另一种方案可以基于scan和矩阵乘法:
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