Вычитая время в R - PullRequest
       3

Вычитая время в R

0 голосов
/ 16 июня 2020

Я хочу подсчитать, сколько времени кто-то проводит в постели ночью. Первый столбец, j1bed (время ложиться спать):

dput(head(subscales$j1bed, 20))

c("23:00:00", "01:00:00", "22:00:00", "00:00:00", "00:00:00", 
"23:00:00", "03:00:00", "23:00:00", "22:00:00", "23:00:00", "21:00:00", 
"23:30:00", "22:00:00", "22:00:00", "20:00:00", "22:00:00", "22:00:00", 
"21:00:00", "20:00:00", "23:00:00")

Второй столбец, j3wake (время просыпается):

dput(head(subscales$j3wake, 20))

c("08:00:00", "08:00:00", "05:00:00", "08:00:00", "07:00:00", 
"07:00:00", "09:00:00", "09:00:00", "08:00:00", "06:00:00", "03:00:00", 
"08:30:00", "07:00:00", "08:00:00", "09:00:00", "07:00:00", "06:00:00", 
"07:00:00", "07:00:00", "12:00:00")

В настоящее время мой код выглядит следующим образом:

Hours_in_Bed<- as.numeric(difftime(strptime(subscales$j3wake, "%I:%M %p" ),strptime(subscales$j1bed, "%I:%M %p" ),units='hours'))

По какой-то причине здесь используется только «NA». Есть идеи?

Изменить: я пробовал следующие три предложения: 1)

result1<-strptime(subscales$j3wake, "%I:%M %p")

result2<-strptime(subscales$j1bed, "%I:%M %p")

Hours_in_Bed<-as.numeric(difftime(result2, result1, units='hours'))

Это дает только "NA" s. 2)

 subscales$j3wake1=as.POSIXct(paste('1970-1-1',subscales$j3wake))
subscales$j1bed1 =as.POSIXct(paste('1970-1-1',subscales$j1bed))
as.numeric(difftime(subscales$j1bed1,subscales$j3wake1,units='hours'))

Это дает "0". 3)

 all(grepl("[0-9]{2}:[0-9]{2} (AM|PM)", subscales$j3wake)) 

all(grepl("[0-9]{2}:[0-9]{2} (AM|PM)", subscales$j1bed))

Оба дают «Ложь».

Редактировать 2: последний совет был ключевым! Я думаю, мне следует использовать вместо этого "% H:% M":

Hours_in_Bed<- as.numeric(difftime(strptime(subscales$j3wake, "%H:%M" ),strptime(subscales$j1bed, "%H:%M" ),units='hours'))

Если я тогда сделаю:

Hours_in_Bed[!is.na(Hours_in_Bed) & Hours_in_Bed<0] <- 24 + Hours_in_Bed[!is.na(Hours_in_Bed) & Hours_in_Bed<0] 

, мне должно быть хорошо go. Сообщите мне, если я все еще отключен, и спасибо за помощь!

1 Ответ

0 голосов
/ 16 июня 2020

Обычно проще использовать тип POSIXct, даже если нет реального года / месяца / дня. Пример:

subscales$j3wake1 = as.POSIXct(paste('1970-1-1',subscales$j3wake))
subscales$j1bed1 = as.POSIXct(paste('1970-1-1',subscales$j1bed))
as.numeric(difftime(subscales$j1bed1,subscales$j3wake1,units='hours'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...