Найти разницу между временем в R

Я хотел бы рассчитать разницу во времени в R "A" и "B". У меня есть данные о часах / минутах / часах вечера, когда люди ложатся спать («А») и в какое время они просыпаются («В»): (df называется временем)

    Hour(A) Min(A) AMPM(A) Hour(B) Min(B) AMPM(B)
    1       30     AM      7       30     AM
    4       00     AM      9       00     AM
    11      30     PM      6       30     AM 

Я провел какое-то исследование и обнаружил, что могу создать время как персонаж, а затем изменить его как формирующее время.

Сначала я использовал функцию unite () (tidyverse), чтобы соединить часы (A) и min (A). Затем я создал другой столбец с «фиктивной» датой (если это был pm: «2019-04-13» и «2019-04-14»). Затем я снова использовал функцию unite (), чтобы соединить дату и время, а с функцией strptime () я изменил класс на время.

Для часа (B), min (B) и AMPM (B) я также использовал функцию unite и объединял три столбца. Затем я применил функцию strptime (), чтобы изменить класс на время.

Наконец, я использую функцию difftime (), чтобы найти разницу между A и B, но я не могу понять, почему я получаю необычные результаты.

 time <- time %>% mutate(Date = ifelse(AMPM(A) == " AM", "2019-04-14", "2019-04-13")) time$Date <- as.Date(time$Date) #Using unite to join Hour(A) with Mins(A) and Hour(B) with Mins(B) time <- time %>% unite(Sleeptime,HourA,MinsA, sep = ":") %>% unite(Wakeuptime, HourB,MinsB, sep = ":") #Adding the seconds time$Sleeptime <- paste0(time$Sleeptime,":00") #Using unite to join Hours(B)Mins(B) with AMPM(B) time <- time %>% unite(Wakeuptime, Wakeuptime ,AMPMWake, sep = "" ) #Changing the class for time (B) time$Wakeuptime2 <- strptime(x = paste0(time$Wakeuptime2, "m"), format = "%I:%M %p") #Joining the fake date for (A) with the time(A) time <- time %>% unite(ST, Date, Sleeptime, sep = " ") #Changing the class for time (A) time$ST = strptime(time$ST,format='%Y-%m-%d %H:%M:%S') #Calculating the difference in time time$difference <- difftime(time$Wakeuptime2, time$ST, units = "hours") 

Мне нужен еще один столбец с разницей в часах или минутах

    Hour(A) Min(A) AMPM(A) Hour(B) Min(B) AMPM(B) DIFF (min)
    1       30     AM      7       30     AM      300
    4       00     AM      9       00     AM      300
    11      30     PM      6       30     AM      420

Всего 1 ответ


Мы могли бы использовать paste чтобы собрать фрагменты времени (A) и времени (B), а затем преобразовать как as.POSIXct . Из времени 8.64e4 с PM мы вычитаем 8.64e4 (один день в секундах). Теперь легко вычислить различия в apply .

tmp <- sapply(list(1:3, 4:6), function(x) {
  cl <- as.POSIXct(apply(time[x], 1, paste, collapse=":"), format="%I:%M:%p")
  return(ifelse(time[tail(x, 1)] == "PM", cl - 8.64e4, cl))
  })
time <- cbind(time, `DIFF(min)`=apply(tmp, 1, diff)/60)
time
#   Hour(A) Min(A) AMPM(A) Hour(B) Min(B) AMPM(B) DIFF(min)
# 1       1     30      AM       7     30      AM       360
# 2       4      0      AM       9      0      AM       300
# 3      11     30      PM       6     30      AM       420

Данные

time <- structure(list(`Hour(A)` = c(1L, 4L, 11L), `Min(A)` = c(30L, 
0L, 30L), `AMPM(A)` = c("AM", "AM", "PM"), `Hour(B)` = c(7L, 
9L, 6L), `Min(B)` = c(30L, 0L, 30L), `AMPM(B)` = c("AM", "AM", 
"AM")), row.names = c(NA, -3L), class = "data.frame")

Есть идеи?

10000