gpt4 book ai didi

regex - 处理由天,小时,分钟和秒定义的持续时间,例如R中的 “1d 3h 2m 28s”

转载 作者:行者123 更新时间:2023-12-03 19:08:52 26 4
gpt4 key购买 nike

我有一个带有字符向量的数据帧,其格式为天,小时,分钟和秒,表示为“1d 3h 2m 28s”:

> head(status[5])
Duration
1 0d 20h 46m 31s
2 2d 0h 13m 54s
3 2d 0h 13m 53s
4 0d 9h 53m 38s
5 5d 12h 17m 37s
6 0d 10h 21m 19s

我可以使用正则表达式来解析组件,但是无法提出一种将持续时间转换为秒的好方法。我可以将向量 gsub成为一个表达式,该表达式将导致秒数,但在结果上使用 eval会遇到障碍。

我可以做一些与推荐的 here类似的事情,但希望遵循正则表达式的方法-即使它不是最有效的。我只处理解析各种小的HTML表。
status$duration <- gsub("(\\d+)d\\s+(\\d+)h\\s+(\\d+)m\\s+(\\d+)s.*","\\1*86400+\\2*3600+\\3*60+\\4",as.character(status[,5]),perl=TRUE)

上面创建了一个可以求值的表达式,但是当涉及到 parse(text=status$duration)和后续的 eval时,我却错过了一些东西。

在perl中,我习惯于在regex表达式中使用“捕获的变量”,并立即使用它们,而不是仅在替换字符串中使用它们。 R中是否有类似的可能性?

谢谢,由于思维模糊,我可能会丢失一些非常简单的内容。

最佳答案

下面的第一个和最后一个解决方案似乎是最简单的,但是具有复杂的正则表达式的解决方案与perl中可能完成的工作更为接近。

在列出解决方案本身之前,请注意,在这些解决方案中,我们假设输入为tt,转换向量mult为4个向量,其成分为一天,小时,分钟和秒的秒数。我们可以像在注释中那样设置mult或计算它,如下所示:

tt <- c("0d 20h 46m 31s", "2d 0h 13m 54s", "2d 0h 13m 53s", 
"0d 9h 53m 38s", "5d 12h 17m 37s", "0d 10h 21m 19s")
# mult <- c(86400, 3600, 60, 1)
mult <- rev(cumprod(rev(c(24, 60, 60, 1))))

这是4种方法:

1)快速提取数字我们可以在gsubfn包中使用 strapply来避免复杂的正则表达式。 strapply用于提取将所有数字排列在一个矩阵中,然后乘以 mult将结果以纯数字矢量形式串起来:
library(gsubfn)
mat <- strapply(tt, "\\d+", as.numeric, simplify = TRUE)
secs <- c(mult %*% mat)

这两行可以合并为一个语句,但是如果您希望单独检查 mat,我们将像上面一样保留它。

2)捆绑使用复杂的正则表达式另一个可能的方法,也使用 strapply是以下单个语句。捕获的字符串在遇到它们时将被放置到自由变量中,因此第一个捕获进入 day,第二个捕获进入 hour,依此类推。这可能与您在perl中所做的更接近:
secs <- strapply(tt, "(\\d+)d (\\d+)h (\\d+)m (\\d+)s", 
~ 86400 * as.numeric(day) + 3600 * as.numeric(hour) +
60 * as.numeric(minute) + as.numeric(second), simplify = TRUE)

3)捆绑了复杂的正则表达式,但矢量化了或更短:
secs <- strapply(tt, "(\\d+)d (\\d+)h (\\d+)m (\\d+)s", 
~ as.numeric(list(...)) %*% mult, simplify = TRUE)

4)strsplit ,这是另一个单个语句的答案。此代码不使用 strapply,而是利用以下事实:仅删除字符串结尾处的匹配分隔符,而不会输出以下空字符串。有关详细信息,请参见 ?strsplit
secs <- sapply(strsplit(tt, "[dhms]"), function(x) as.numeric(x) %*% mult)

以上任何一项的结果是:
> secs
[1] 74791 173634 173633 35618 476257 37279

关于regex - 处理由天,小时,分钟和秒定义的持续时间,例如R中的 “1d 3h 2m 28s”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7802903/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com