【问题标题】:R converting hour min in minutesR在分钟内转换小时分钟
【发布时间】:2016-10-09 05:18:02
【问题描述】:

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

Step1:对于所有以 min 为单位的值,只提取数字

Step2:对于小时和分钟的所有值,将其转换为最小值并仅提取结果数字

Step3:对于每一行,将提取的值添加到新列中

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

我使用了以下代码,它成功地提取了数字。但是,当时间为 hr min 时,它不会完成任务。例如。 '1hr 30min' 中的 '1' 只被提取,但 '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")
 }

【问题讨论】:

    标签: r regex


    【解决方案1】:

    我们可以使用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 选项是使用sub 将“h”替换为* 60 +,删除“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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-18
      • 1970-01-01
      • 2014-12-01
      • 2015-07-20
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多