我有一个数据框,其中包含时间值的列在" 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): dim(X)必须具有正长度
也许我没有正确使用apply函数。无论如何,如果你能指出我做错了什么,我将不胜感激!
答案 0 :(得分:2)
基于该功能,我们可以遍历元素然后应用
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
或数据集列,而apply
需要维对象,即matrix
或{{1} }}。