Объедините столбцы часов и минут в одном столбце и получите разницу во времени в R - PullRequest
1 голос
/ 16 апреля 2020

Уважаемые участники сообщества R, у меня есть набор данных в 12-часовом формате, сконструированный следующим образом:

departurehour   departureminute  arrivalhour   arrivalminute 
4                30               4             50    
9                10               9             30
8                10               8             18

И я хочу получить следующий вывод с временем коммутирования (в формате минут). Время в пути = Время прибытия - Время отправления.

Departuretime   Arrivaltime     Commutetime 
4:30            4:50               20 
9:10            9:30               20
8:10            8:18                8  

Буду очень признателен за своевременную помощь. Заранее большое спасибо.

Ответы [ 3 ]

2 голосов
/ 16 апреля 2020

С dplyr:

 df %>% 
  mutate(ArrivalTime = paste0(arrivalhour,":",arrivalminute),
          DepartTime = paste0(departurehour,":",departureminute)) %>% 
   select(ends_with("Time")) %>% 
   mutate(DepartTime = strptime(DepartTime, format="%H:%M"),
         ArrivalTime = strptime(ArrivalTime, format="%H:%M"),
          Total =difftime(ArrivalTime, DepartTime)) 
          ArrivalTime          DepartTime   Total
1 2020-04-16 04:50:00 2020-04-16 04:30:00 20 mins
2 2020-04-16 09:30:00 2020-04-16 09:10:00 20 mins
3 2020-04-16 08:18:00 2020-04-16 08:10:00  8 mins

ПРИМЕЧАНИЕ Для работы difftime необходим некоторый компонент даты.

Данные

df <- structure(list(departurehour = c(4L, 9L, 8L), departureminute = c(30L, 
10L, 10L), arrivalhour = c(4L, 9L, 8L), arrivalminute = c(50L, 
30L, 18L)), class = "data.frame", row.names = c(NA, -3L))
2 голосов
/ 16 апреля 2020

Мы можем объединить departurehour и departureminute, чтобы получить departuretime и сделать то же самое для arrivaltime. Вычтите значения из arrivaltime и departuretime, используя difftime, чтобы получить разницу во времени в минутах.

library(dplyr)
library(tidyr)

df %>%
  unite(departuretime, departurehour, departureminute, sep = ":") %>%
  unite(arrivaltime, arrivalhour, arrivalminute, sep = ":") %>%
  mutate(Commutetime = as.numeric(difftime(
          as.POSIXct(sprintf("%04s", arrivaltime), format = "%H:%M"), 
          as.POSIXct(sprintf("%04s", departuretime), format = "%H:%M"), 
          units = "mins")))

#  departuretime arrivaltime Commutetime
#1          4:30        4:50          20
#2          9:10        9:30          20
#3          8:10        8:18           8
1 голос
/ 16 апреля 2020

Вот вариант с data.table

library(data.table)
setDT(df1)[, .(departuretime = sprintf("%02d:%02d", departurehour,
    departureminute), arrivaltime = sprintf("%02d:%02d", arrivalhour,
       arrivalminute))][, CommuteTime := 
       as.numeric(as.ITime(arrivaltime) - as.ITime(departuretime))/60][]
#   departuretime arrivaltime CommuteTime
#1:         04:30       04:50          20
#2:         09:10       09:30          20
#3:         08:10       08:18           8

data

df1 <- structure(list(departurehour = c(4L, 9L, 8L), departureminute = c(30L, 
10L, 10L), arrivalhour = c(4L, 9L, 8L), arrivalminute = c(50L, 
30L, 18L)), class = "data.frame", row.names = c(NA, -3L))
...