2013-07-26 3 views
2

24 시간보다 큰 시간 값에 대한 계산을 수행하려고합니다. 이 짧은 예에서는 취침 시간과 취침 시각을 기준으로 다른 사람의 수면 시간을 계산하려고합니다. 그러나 취침 시간이 자정 이후 인 경우 데이터는 24 시간보다 큰 시간 값으로 입력됩니다. 예를 들어, 누군가 2시에 잠을 자면, 취침 시간은 26:00:00입니다. R에서 24 시간보다 큰 시간 값을 처리하려면 어떻게해야합니까?24 시간보다 큰 시간 값으로 작업 R

library(chron) 

bedtime <- c("22:37:34","23:03:32","24:41:23") 
waketime <- c("06:41:23","07:25:18","08:47:08") 

bedtimeAsTime <- chron(times=bedtime) #results in error 
waketimeAsTime <- chron(times=waketime) 

#Add 24 hours 
waketimeAsTime <- waketimeAsTime + 1 

sleepDuration <- waketimeAsTime - bedtimeAsTime 

는 역대 기능은 24 시간 이상 시간 값을 받아 NA로 변환하지 않습니다

은 여기 내 짧은 예를 시도합니다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까? 사전에

감사합니다!

+2

시간은 다루지 않지만 기간은 있습니다. 나는 패키지 rubridate가 duration 객체를 구현했다고 생각한다. – Roland

+0

POSIXct 값에 대해 산술 연산을 수행 할 수 있습니다. –

+0

아마 모든 시간을 초 단위로 변환하는 것이 가장 좋을까요? 그런 다음 모든 waketimes에 24 * 3600을 추가하십시오. –

답변

3

이미이 작업을 수행하는 패키지가 있지만이 모든 시간을 strsplitas.numeric을 사용하여 초로 변환 할 수 있습니다.

ConvertToSeconds <- function(X) 
{ 
    X <- strsplit(X, ":") 
    sapply(X, function(Y) sum(as.numeric(Y) * c(3600, 60, 1))) 
} 

bedtime <- ConvertToSeconds(bedtime) 
waketime <- ConvertToSeconds(waketime) + (86400) #Seconds in 24 hours 

sleeptime <- waketime-bedtime 
sleeptime 
[1] 29029 30106 29145 
+0

감사합니다. 효율적이고 이해하기 쉽기 때문에 도움이됩니다. – dadrivr

1

당신은 그곳에있는 대부분의 방법이었습니다.

normTimes이라는 약간의 도우미 함수를 작성하여 23보다 큰 시간으로 시간을 변환 한 다음 하나를 초과 한 sleepDuration에서 1을 뺍니다.

require(chron) 
bedtime <- c("22:37:34","23:03:32","24:41:23") 
waketime <- c("06:41:23","07:25:18","08:47:08") 

normTimes <- function(Tt) 
{ 
    hourFun <- function(hrs) 
    { 
     if(nchar(hrs) == 1) 
     { 
      paste0(0, hrs, substr(tt, 3, 8)) 
     } else { 
      paste0(hrs, substr(tt, 3, 8)) 
     } 
    } 
    tt <- Tt[substr(Tt, 1, 2) > 23] 
    adjt <- as.numeric(substr(tt, 1, 2)) - 23 
    Tt[substr(Tt, 1, 2) > 23] <- sapply(adjt, hourFun) 
    return(Tt) 
} 

bedtime <- normTimes(bedtime) 
bedtimeAsTime <- chron(times=bedtime) #no longer results in an error 
waketimeAsTime <- chron(times=waketime) 

#Add 24 hours 
waketimeAsTime <- waketimeAsTime + 1 

sleepDuration <- waketimeAsTime - bedtimeAsTime 
sleepDuration[sleepDuration > 1] <- sleepDuration[sleepDuration > 1] - 1 

(sleepDuration) 
[1] 08:03:49 08:21:46 07:05:45 

그리고 거기에 있습니다!

+0

구현하고있는 구조에서 예제를 마무리하는 방법을 보여 주셔서 감사드립니다. 고마워, 고마워! – dadrivr

관련 문제