【问题标题】:Turning text with hours and minutes to minutes将带有小时和分钟的文本转换为分钟
【发布时间】:2020-12-16 00:29:36
【问题描述】:

我有一个大数据框,如下所示:

from to distance in km traveltime
1033 1076 1.8 6 mins
1035 1076 2.6 1 min
1036 1076 2.4 1 hour 26 mins
1037 1076 6.7 3 hours 1 min

我想让 traveltime 列以分钟为单位显示旅行时间,所以像这样:

from to distance in km traveltime
1033 1076 1.8 6
1035 1076 2.6 1
1036 1076 2.4 86
1037 1076 6.7 181

我尝试了hm() 函数,但它不适用于小于 1 小时的值。

【问题讨论】:

    标签: r time extract


    【解决方案1】:

    尝试在字符串的嵌套替换中包装时间转换:

    #Code
    df$NewTime <- unname(sapply(sub('s','',sub("\\s+min",
                      "", sub("hour|hours", "* 60 +", df$traveltime))), 
                  function(x) eval(parse(text=x))))
    

    输出:

    df
      from   to distance.in.km     traveltime NewTime
    1 1033 1076            1.8         6 mins       6
    2 1035 1076            2.6          1 min       1
    3 1036 1076            2.4 1 hour 26 mins      86
    4 1037 1076            6.7  3 hours 1 min     181
    

    使用的一些数据:

    #Data
    df <- structure(list(from = c(1033L, 1035L, 1036L, 1037L), to = c(1076L, 
    1076L, 1076L, 1076L), distance.in.km = c(1.8, 2.6, 2.4, 6.7), 
        traveltime = c("6 mins", "1 min", "1 hour 26 mins", "3 hours 1 min"
        )), row.names = c(NA, -4L), class = "data.frame")
    

    另一个使用stringr的选项:

    library(stringr)
    #Code 2
    df$NewTime <- sapply(str_extract_all(df$traveltime, "\\d+"), function(x) {
      x1 <- as.numeric(x)
      if(length(x1)>1) x1[1]*60 + x1[2] else x1 })
    

    它将产生相同的输出。

    【讨论】:

      【解决方案2】:

      另一种解决方案是提取数字子字符串。首先,将数字放入列表中,然后乘以 60 将小时转换为分钟。

      matches <- regmatches(df$traveltime, gregexpr("[[:digit:]]+", df$traveltime))
      hr_mins <- lapply(matches, function(x){
        x <- as.numeric(x)
        if(length(x) > 1) x[1] * 60 + x[2] else x
      })
      df$traveltime <-  unlist(hr_mins)
      

      输出

        from   to distance.in.km traveltime
      1 1033 1076            1.8          6
      2 1035 1076            2.6          1
      3 1036 1076            2.4         86
      4 1037 1076            6.7        181
      

      数据

      df <- structure(list(from = c(1033, 1035, 1036, 1037), to = c(1076, 
      1076, 1076, 1076), distance.in.km = c(1.8, 2.6, 2.4, 6.7), traveltime = c("6 mins", 
      "1 min", "1 hour 26 mins", "3 hours 1 min")), class = "data.frame", row.names = c(NA, 
      -4L))
      

      【讨论】:

        【解决方案3】:

        您可以将traveltime 转换为lubridateperiod 对象,将周期对象转换为秒数,然后除以60 得到持续时间(以分钟为单位)。

        library(lubridate)
        df$travel_min <- period_to_seconds(period(df$traveltime))/60
        df
        
        #  from   to distance.in.km     traveltime travel_min
        #1 1033 1076            1.8         6 mins          6
        #2 1035 1076            2.6          1 min          1
        #3 1036 1076            2.4 1 hour 26 mins         86
        #4 1037 1076            6.7  3 hours 1 min        181
        

        【讨论】:

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