在R中将数字更改为秒

时间:2016-02-16 09:40:39

标签: r time

我的数字看起来像这样:3038,2180,2120等等,它们的真正含义是例如3038 = 3分钟,3秒和8分钟。我在本专栏中有超过10万个观察结果。 我想要的只是几秒钟: 183,8秒

我应该使用lubridate吗?以及如何使用?

4 个答案:

答案 0 :(得分:3)

我更喜欢使用数学运算来转换数字。也许这会有所帮助:

onlysecs <- function(x) (x/1000-floor(x/1000))*100
minsecs <- function(x) floor(x/1000)*60
onlysecs(x) + minsecs(x)
#[1] 183.8 138.0 132.0

数据

x <- c(3038, 2180, 2120)

给@docendo discimus提示,指出不需要sapply()

答案 1 :(得分:1)

你可以尝试

num <- c(3038, 2180, 2120)
m <- regmatches(num, regexec("(\\d)(\\d{2})(\\d)", as.character(num)))
sapply(m, function(x) { 
  x <- as.integer(x) * c(0, 60, 1, 1/10)
  return(sum(x))
})
# [1] 183.8 138.0 132.0

答案 2 :(得分:1)

我们可以使用substr

as.numeric(substr(t1,1,1))*60 + 
      as.numeric(substr(t1,2,3)) + 
      as.numeric(substr(t1,4,4))/10
#[1] 183.8 138.00 132.00   NA

strsplit

i1 <- t1!=0
t1[i1] <- t(sapply(strsplit(gsub('(.)(..)(.)', '\\1,\\2,\\3', t1[i1]),
         ','), as.numeric)) %*% c(60, 1, 1/10)
t1
#[1] 183.8 138.0 132.0   0.0

数据

t1 <- c(3038, 2180, 2120, 0)

答案 3 :(得分:0)

我的简单解决方案:

n<-c(3038, 2180, 2120) 
minute<-as.integer(n/1000)*60
lastdigit<-n%%10/10
mid<-as.integer(substr(as.character(n),2,3))
sum<-minute+lastdigit+mid
sum 

[1] 183.8 138.0 132.0