将“小时”和“分钟”列合并到一列中,以R表示时差

将“小时”和“分钟”列合并到一列中,以R表示时差,r,lubridate,R,Lubridate,亲爱的R社区成员:, 我有一个12小时格式的数据集,设计如下: departurehour departureminute arrivalhour arrivalminute 4 30 4 50 9 10 9 30 8 10 8 18

亲爱的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  
我将非常感谢你及时的帮助。
事先非常感谢

我们可以将
departurehour
departureminute
组合起来,以获得
departuretime
,并对
arrivaltime
执行相同的操作。使用
difftime
arrivaltime
departuretime
中减去值,以分钟为单位计算时差

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

我们可以组合
departurehour
departureminute
以获得
departuretime
,并对
arrivaltime
执行相同的操作。使用
difftime
arrivaltime
departuretime
中减去值,以分钟为单位计算时差

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

使用
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))

df带
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))

df这里有一个带有
数据的选项。表

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
数据
df1这里有一个带有
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
数据
df1