我试图做一个函数,将时间(以字符形式)转换为十进制格式,例如1对应于上午1点,23对应于下午11点,24表示一天结束。向量化使用strsplit的函数
下面是这两个函数。这里一个函数向量化,而其他做
time2dec <- function(time0)
{
time.dec <-as.numeric(substr(time0,1,2))+as.numeric(substr(time0,4,5))/60+(as.numeric(substr(time0,7,8)))/3600
return(time.dec)
}
time2dec1 <- function(time0)
{
time.dec <-as.numeric(strsplit(time0,':')[[1]][1])+as.numeric(strsplit(time0,':')[[1]][2])/60+as.numeric(strsplit(time0,':')[[1]][3])/3600
return(time.dec)
}
这是我得到...
times <- c('12:23:12','10:23:45','9:08:10')
#>time2dec(times)
[1] 12.38667 10.39583 NA
Warning messages:
1: In time2dec(times) : NAs introduced by coercion
2: In time2dec(times) : NAs introduced by coercion
#>time2dec1(times)
[1] 12.38667
我知道time2dec
这是矢量,给人NA最后一个元素,因为它提取9:
代替9
作为小时。这就是为什么我创建了time2dec1
,但我不知道为什么它没有得到矢量化。
我也会对获得更好的功能来做我想做的事情感兴趣。 我看到了this,它解释了我的问题的一部分,但没有提供我尝试做的事情的线索。
我的时间字符串非常长(45000),并且处于上述字符格式。将转换为'as.POSIXct'不占用更多的CPU时间? –
它可能比正则表达式更快。当然,它实际上是矢量化的,与使用'apply'功能的解决方案相反。但是你可以用自己的基准测试... – Roland
使用'as.POSIXct'比在几次使用'sapply'快2倍 –