R以分钟为单位转换小时

时间:2016-10-09 05:18:02

标签: r regex

我有一个数据集(名为A ),其列为' TimeColumn '显示在快照中。 我想完成以下任务:

步骤1:对于min中的所有值,仅提取数字

步骤2:对于以小时和分钟为单位的所有值,将其转换为min并仅提取结果数字

步骤3:对于每一行,将提取的值添加到新列

所以例如,如果条目是119分钟,我想提取119.如果条目是1小时30分钟,我想提取90。

我使用了以下代码,它成功地提取了数字。但是,当时间以小时为单位时,它无法完成任务。例如。 ' 1'在< 1小时30分钟'只是提取但是' 30'不是。

for (num in seq(1,length(A$TimeColumn), by=1))  #replace 100 by nrow(A)
{
  cat("Row number",num, "is",as.numeric(gsub("([0-9]+).*$", "\\1",A$TimeColumn[num] )))
  cat("\n")
 }

Column containing time in min or in hr min

1 个答案:

答案 0 :(得分:3)

我们可以使用str_extract_all(从stringr)提取“TimeColumn”中的数字到list,循环遍历list元素(sapply(...) ),将其转换为'numeric'('x1'),if length大于1,然后执行算术将小时转换为分钟或else返回分钟,并将其分配给新列'Min'。

library(stringr)
A$Min <- sapply(str_extract_all(A$TimeColumn, "\\d+"), function(x) {
              x1 <- as.numeric(x)
          if(length(x1)>1) x1[1]*60 + x1[2] else x1 })
A$Min
#[1]  98 119 105  90  92 135 104 100 104  93

base R选项是使用* 60 +将'h'替换为sub,删除'min'子字符串并进行评估

unname(sapply(sub("\\s+min", "", sub("h", "* 60 +", A$TimeColumn)), 
              function(x) eval(parse(text=x))))
#[1]  98 119 105  90  92 135 104 100 104  93

数据

A <- structure(list(TimeColumn = c("98 min", "119 min", "105 min", 
"1h 30 min", "92 min", "135 min", "104 min", "100 min", "104 min", 
"93 min")), .Names = "TimeColumn", row.names = c(NA, -10L), 
class = "data.frame")