我正在使用一个数据框,该数据框的变量名为"持续时间"使用以下格式的值:
1h 7m 46s
0h 16m 41s
..等等。该列被格式化为"因子"默认情况下,我想知道如何将其转换为实际持续时间。我希望能够计算持续时间的平均值和总和。
答案 0 :(得分:5)
您可以按如下方式提取小时,分钟和秒:
x <- c('1h 7m 46s','0h 16m 41s')
hours <- as.numeric(gsub('^(?:.* )?([0-9]+)h.*$','\\1',x))
minutes <- as.numeric(gsub('^.* ([0-9]+)m.*$','\\1',x))
seconds <- as.numeric(gsub('^.* ([0-9]+)s.*$','\\1',x))
duration_seconds <- seconds + 60*minutes + 60*60*hours
分钟的模式转换为:以(^
)个零(或*
)个字符(.
)开头,后跟空格() ,后跟一个或多个(
+
)个数字([0-9]
),后跟字母m(m
),后跟零个或多个(*
)个字符({{1 }}到字符串的末尾(.
)
奖励:正则表达式中的$
小时为非捕获组((?:.* )?
),消耗零个或多个((?: )
)图表(*
)后跟一个空格(.
)。请注意,因为是非捕获gruop。
(?:.* )?
仍然引用数字字符串。
答案 1 :(得分:4)
考虑将时间转换为as.character()
强制转换的字符串。一旦您的时间是字符串,您可以使用DateTime
命令将它们转换为strptime
个对象,例如
> s <- "1h 7m 46s"
> tfmt <- "%Hh %Mm %Ss"
> t1 <- strptime(s, format=tfmt)
> s <- "0h 16m 41s"
> t2 <- strptime(s, format=tfmt)
使用这种格式的数据非常方便,因为有工具可以使用它们
> t1
[1] "2015-01-30 01:07:46"
> t2
[1] "2015-01-30 00:16:41"
> t1 - t2
Time difference of 51.08333 mins
> difftime(t1, t2, units="secs")
Time difference of 3065 secs