我的数字看起来像这样:3038,2180,2120等等,它们的真正含义是例如3038 = 3分钟,3秒和8分钟。我在本专栏中有超过10万个观察结果。 我想要的只是几秒钟: 183,8秒
我应该使用lubridate吗?以及如何使用?
答案 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