代码之家  ›  专栏  ›  技术社区  ›  user3725021

将字符数据帧列转换为分数时间

  •  2
  • user3725021  · 技术社区  · 7 年前

    我有一个数据框,其中有一列包含“HH:MM:SS”格式的时间值。我编写了一个函数,将其转换为分数值

    convertTime = function(ttime){
      ttime2 =strsplit(ttime,":")
      h = as.numeric(ttime2[[1]][1])
      m = as.numeric(ttime2[[1]][2])
      hh = h + m/60
      return(hh/24)
    }
    
    convertTime("11:30:00")
    

    [1] 0.4791667

    这很好用。但是,当我尝试将此应用于整个列时,我收到一个错误:

    data = data.frame(c("17:30:00", "13:00:00", "19:30:00"))
    colnames(data) = c("timeString")
    decimalTime = apply(data$timeString, 2, convertTime)
    

    应用时出错(dat$gameTime,2,convertTime): 尺寸(X)必须为正长

    也许我没有正确使用apply函数。无论如何,如果你能指出我做错了什么,我将不胜感激!

    1 回复  |  直到 7 年前
        1
  •  2
  •   akrun    7 年前

    根据函数,我们可以循环遍历元素,然后应用

    sapply(as.character(data$timeString), convertTime)
    #  17:30:00  13:00:00  19:30:00 
    #0.7291667 0.5416667 0.8125000 
    

    而不是 sapply 循环在函数外,可以更改函数

    convertTime2 <- function(ttime) {
      ttime2 <- strsplit(ttime,":")
       sapply(ttime2, function(x) {x1 <- as.numeric(x)
                 (x1[1] + x1[2]/60)/24
                  })
     }
    
    convertTime2("11:30:00")
    #[1] 0.4791667
    convertTime2(as.character(data$timeString))
    #[1] 0.7291667 0.5416667 0.8125000
    

    这个 apply 将不起作用,因为 data$timeString 是一个 vector 或数据集列和 申请 需要一个维度对象,即 matrix data.frame