基于第一个和最后一个值的时差

时间:2019-07-25 02:07:00

标签: r dataframe

我有一个家庭的col1指数,每个家庭中的人的col2指数,每个人的旅行的col3指数,每个人的旅行的col4指数,col5和col6活动的开始和结束时间开始时间是第一次旅行的开始时间而结束时间是最后一次旅行的结束时间的每个家庭中每个人的每次旅行对应的列?

这是一个例子

 family    persons    trip    tour   start time   end time
   1      1        1        1         3         8:45
   1      1        2        1       8:45        13:30
   1      1        3        1       13:30       15
   1      1        4        1      15:00        15:30
   1      1        5        2      20:00        22:00
   1      1        6        2      22:00       8:30
   1      2        1        1       3:00        8:00
   1      2        2        1      8:00        17:00
   1      2        3        1      17:00       24:00
   1      3        1        1       8:00       23:00
   1      3        2        1        23:00      24:00

第一人称游览2次,旅行6次。第一次旅行的第一次旅行在3:00开始,最后一次旅行在15:30结束,第二次旅行的开始时间在20:00,最后一次旅行在8:30结束!

第二人称进行1次旅行和3次旅行。在这次旅行中,第一次旅行的开始时间为3,最后一次旅行的结束时间为24:00。

第三人称进行1次旅行和2次旅行,第一次旅行的开始时间为上午8点,最后一次旅行的结束时间为24:00

所以我需要以下数据作为输出

  family    persons    trip    tour   start time   end time
     1      1        1        1         3         15:30
     1      1        5        2        20:00        8:30
     1      2        1        1        3:00        24:00
     1      3        1        1        8:00        24:00

因此,每次游览我们都有一行

1 个答案:

答案 0 :(得分:1)

由于您的starttimeendtime并非标准格式,并且包含多种格式,因此我们首先需要将它们转换为标准格式。我们可以通过指定列可以采用的各种格式来使用lubridate::parse_date_time。一次,我们可以group_by familypersonstour分别选择开始时间和结束时间的最小值和最大值。

library(dplyr)

df %>%
    mutate_at(vars(starttime, endtime), 
            list(new = ~lubridate::parse_date_time(., c("%H:%M", "%H")))) %>%
  group_by(family, persons, tour) %>%
  summarise(starttime = starttime[which.min(starttime_new)], 
            endtime = endtime[which.max(endtime_new)])

#  family persons  tour starttime endtime
#   <int>   <int> <int> <fct>     <fct>  
#1      1       1     1 3         15:30  
#2      1       1     2 20:00     22:00  
#3      1       2     1 3:00      24:00  
#4      1       3     1 8:00      24:00  

数据

df <- structure(list(family = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L), persons = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 
3L), trip = c(1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 1L, 2L), tour = c(1L, 
1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L), starttime = structure(c(7L, 
10L, 1L, 2L, 4L, 5L, 8L, 9L, 3L, 9L, 6L), .Label = c("13:30", 
"15:00", "17:00", "20:00", "22:00", "23:00", "3", "3:00", "8:00", 
"8:45"), class = "factor"), endtime = structure(c(10L, 1L, 2L, 
3L, 5L, 9L, 8L, 4L, 7L, 6L, 7L), .Label = c("13:30", "15", "15:30", 
"17:00", "22:00", "23:00", "24:00", "8:00", "8:30", "8:45"), class = 
"factor")), class = "data.frame", row.names = c(NA, -11L))