如何更简洁地从 "start - end" 字符串计算持续时间
How to calculate duration from a "start - end" string more succinctly
我有时间戳指示事件开始时间和结束时间:
x <- "00:01:00.000 - 00:01:10.500"
我需要计算事件的持续时间。使用 lubridate
包中的 hms
以及 lapply
和 strsplit
确实给了我预期的输出:
library(lubridate)
unlist(lapply(strsplit(x, split=" - "), function(x) as.numeric(hms(x))))[2] - unlist(lapply(strsplit(x, split=" - "), function(x) as.numeric(hms(x))))[1]
[1] 10.5
但我觉得代码非常不优雅,一点也不简洁。有没有更好的方法来获取持续时间?
编辑:
如果确实是,那么x
中的值不止一个,如:
x <- c("00:01:00.000 - 00:01:10.500", "00:12:12.000 - 00:13:10.500")
我想出了这个解决方案:
timepoints <- lapply(strsplit(x, split=" - "), function(x) as.numeric(hms(x)))
duration <- lapply(timepoints, function(x) x[2]-x[1])
duration
[[1]]
[1] 10.5
[[2]]
[1] 58.5
但是,再一次,肯定有一个更好更短的。
这里有一个方法:
as.numeric(diff(lubridate::hms(strsplit(x, split=" - ")[[1]])))
#[1] 10.5
将其保留在基数 R 中:
as.numeric(diff(as.POSIXct(strsplit(x, split=" - ")[[1]], format = '%H:%M:%OS')))
#[1] 10.5
对于多个值,我们可以使用sapply
:
library(lubridate)
sapply(strsplit(x, " - "), function(y) diff(period_to_seconds(hms(y))))
#[1] 10.5 80.5
在基数 R 中:
sapply(strsplit(x, " - "), function(y) {
x1 <- as.POSIXct(y, format = '%H:%M:%OS')
difftime(x1[2], x1[1], units = "secs")
})
假设 x
可以是字符向量,使用 read.table
将其读入数据框,然后将相关列转换为 hms,取其差值并转换为数字,给出所示向量.如果您使用的是 4.0 之前的 R 版本,则可能需要 read,table
的 as.is=TRUE
参数。
library(lubridate)
# test input
x <- c("00:01:00.000 - 00:01:10.500", "00:01:00.000 - 00:01:10.500")
with(read.table(text = x), as.numeric(hms(V3) - hms(V1)))
## [1] 10.5 10.5
或使用 magrittr 和与上面相同的输入 x
:
library(lubridate)
library(magrittr)
x %>%
read.table(text = .) %$%
as.numeric(hms(V3) - hms(V1))
## [1] 10.5 10.5
我有时间戳指示事件开始时间和结束时间:
x <- "00:01:00.000 - 00:01:10.500"
我需要计算事件的持续时间。使用 lubridate
包中的 hms
以及 lapply
和 strsplit
确实给了我预期的输出:
library(lubridate)
unlist(lapply(strsplit(x, split=" - "), function(x) as.numeric(hms(x))))[2] - unlist(lapply(strsplit(x, split=" - "), function(x) as.numeric(hms(x))))[1]
[1] 10.5
但我觉得代码非常不优雅,一点也不简洁。有没有更好的方法来获取持续时间?
编辑:
如果确实是,那么x
中的值不止一个,如:
x <- c("00:01:00.000 - 00:01:10.500", "00:12:12.000 - 00:13:10.500")
我想出了这个解决方案:
timepoints <- lapply(strsplit(x, split=" - "), function(x) as.numeric(hms(x)))
duration <- lapply(timepoints, function(x) x[2]-x[1])
duration
[[1]]
[1] 10.5
[[2]]
[1] 58.5
但是,再一次,肯定有一个更好更短的。
这里有一个方法:
as.numeric(diff(lubridate::hms(strsplit(x, split=" - ")[[1]])))
#[1] 10.5
将其保留在基数 R 中:
as.numeric(diff(as.POSIXct(strsplit(x, split=" - ")[[1]], format = '%H:%M:%OS')))
#[1] 10.5
对于多个值,我们可以使用sapply
:
library(lubridate)
sapply(strsplit(x, " - "), function(y) diff(period_to_seconds(hms(y))))
#[1] 10.5 80.5
在基数 R 中:
sapply(strsplit(x, " - "), function(y) {
x1 <- as.POSIXct(y, format = '%H:%M:%OS')
difftime(x1[2], x1[1], units = "secs")
})
假设 x
可以是字符向量,使用 read.table
将其读入数据框,然后将相关列转换为 hms,取其差值并转换为数字,给出所示向量.如果您使用的是 4.0 之前的 R 版本,则可能需要 read,table
的 as.is=TRUE
参数。
library(lubridate)
# test input
x <- c("00:01:00.000 - 00:01:10.500", "00:01:00.000 - 00:01:10.500")
with(read.table(text = x), as.numeric(hms(V3) - hms(V1)))
## [1] 10.5 10.5
或使用 magrittr 和与上面相同的输入 x
:
library(lubridate)
library(magrittr)
x %>%
read.table(text = .) %$%
as.numeric(hms(V3) - hms(V1))
## [1] 10.5 10.5