2013-07-26 59 views
2

我試圖對大於24小時的時間值執行計算。在這個簡短的例子中,我試圖根據他們的就寢時間和覺醒時間來計算某人的睡眠時間。但是,如果就寢時間是在午夜之後,則數據以大於24小時的時間值輸入。例如,如果有人在凌晨2點入睡,他們的就寢時間值爲26:00:00。我如何處理R中超過24小時的時間值?在R中使用大於24小時的時間值

這是我簡單的例子嘗試:

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

你沒有處理時間,但與持續時間。我認爲軟件包lubridate已經實施了持續時間對象。 – Roland

+0

您可以對POSIXct值進行算術運算。 –

+0

你可能會將所有這些時間轉換爲秒數最好嗎?然後將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