【问题标题】:In R, how do I extract minutes and seconds from characters在R中,如何从字符中提取分钟和秒
【发布时间】:2014-11-30 23:18:17
【问题描述】:

我正在尝试将 R 中的一列拆分为分钟和秒。问题是,该列只是数字:例如它将有“752”、“843”、“823”、“956”、(最高约 2000)等......代表 7 分钟和 52秒、8 分 43 秒、8 分 23 秒等……我想把它分成两列。一列表示分钟数,一列表示秒数。然后,我将使用这些列创建第三个“totalSeconds”,在 7 分 52 秒内将具有“472”。

我一直在搜索,检查正则表达式等。我似乎无法弄清楚。此处的另一个类似问题将我指向函数“substr”,但我坚持这一点,因为每个变量中的字符数并不总是相同,即 752 与 1145。有什么帮助吗?或者至少也许有人可以指出我正确的方向?

【问题讨论】:

  • 2000 代表什么?
  • @RStudent 我想那是 20 分钟

标签: r time


【解决方案1】:

如果字符的最后两个元素代表秒,而剩余的前一个/两个元素代表分钟,请尝试以下操作:

res <- data.frame(v = v, minutes = substr(v, 1, nchar(v)-2), seconds = substr(v, nchar(v)-1, nchar(v)))
> res
    v minutes seconds
1 752       7      52
2 843       8      43
3 823       8      23
4 956       9      56

为了计算总秒数:

res <- as.data.frame(apply(res, 2, function(x) as.double(as.character(x))))
res$tot.sec <- res$minutes*60 + res$seconds
> res
    v minutes seconds tot.sec
1 752       7      52     472
2 843       8      43     523
3 823       8      23     503
4 956       9      56     596

【讨论】:

    【解决方案2】:

    您可以考虑来自“tidyr”的separate。在这里,我将它与来自“dplyr”的mutate 结合使用,以获得您正在寻找的输出。

    请注意,separate 允许您根据sep 的值是正数还是负数,从字符串的左侧或从字符串的右侧指定。这将使我们能够适当地处理像“1000”这样的情况。

    library(dplyr)
    library(tidyr)
    
    df %>% 
      separate(secs, into = c("min", "sec"), sep = -3) %>% 
      mutate(tot = as.numeric(min)*60 + as.numeric(sec))
    #   min sec tot
    # 1   7  52 472
    # 2   8  43 523
    # 3   8  23 503
    # 4   9  56 596
    # 5  10  00 600
    

    样本数据:

    df <- data.frame(secs = c("752","843","823", "956", "1000"))
    

    【讨论】:

      【解决方案3】:

      在这个例子中:

       df=data.frame(D=round(1000*runif(100)))
      

      D 是包含您的字符串的列。如果你这样做:

      df$MIN=ifelse(nchar(df$D)>=3,substr(df$D, 0,1),0) #if there are only seconds
      

      这将返回分钟

      df$SEC=substr(df$D, nchar(df$D)-1,nchar(df$D))
      

      将返回秒数。

      这是你想要的吗?

      【讨论】:

      • 差不多了,它会正确分割像 815 这样的东西,但是像 1000 这样的东西会变得混乱,变成 1 和 00。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-27
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      相关资源
      最近更新 更多