3

24 時間を超える時間値の計算を実行しようとしています。この短い例では、就寝時間と起床時間に基づいて誰かの睡眠時間を計算しようとしています。ただし、就寝時刻が午前 0 時以降の場合、データは 24 時間よりも長い時間値として入力されます。たとえば、誰かが午前 2 時に就寝した場合、就寝時間の値は 26:00:00 です。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

chron 関数は、24 時間を超える時間値を受け入れず、NA に変換します。これに対処する方法についてのアイデアはありますか?

前もって感謝します!

4

2 に答える 2

4

すでにこれを行うパッケージがあると確信していますが、 and を使用してこれらすべての時間を秒に変換できstrsplitますas.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
于 2013-07-26T21:01:43.107 に答える
1

あなたはほとんどそこにいました。

normTimes23 時間を超える時間を変換するために呼び出される小さなヘルパー関数を作成し、1 を超えたところで 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

そして、あなたはそれを持っています!

于 2013-07-26T21:52:21.927 に答える