【问题标题】:finding overlapping time in a group在组中查找重叠时间
【发布时间】:2019-09-04 22:16:06
【问题描述】:

在每个家庭中,我想定义一个指标,该指标确定司机是否可以供乘客使用。如果他/她的行程在乘客行程后最多 1 小时开始,则司机有空。

示例:

      household    person     mode       start
           1         1         car        7:20
           1         1         car        8:00
           1         1         car        8:30
           1         2       non-car      7:30
           1         3       non-car      7:15
           1         4         car        7:00
           2         1          car       7:00
           2         2        non-car      9:00

第一个家庭司机可以搭车,因为他的行程比第二个人晚30分钟,他也可以搭车给第三个人。在第二户口。

输出

      household    person     mode       start      indicator
           1         1         car        8:00          1 
           1         2       non-car      7:30          1
           1         3       non-car      7:15          1
           2         1          car       7:00          0
           2         2        non-car      9:00         0

然后我想将这些匹配的行(指示符为 1)并排放置

输出

      household    person     mode       start      indicator   household    person     mode       start      indicator
           1         1         car        8:00          1       2         2       non-car      7:30          1
           1         1         car        8:00          1       3         2       non-car      7:15          1

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    我们使用as.POSIXct将'start'转换为datetime类,按'household'分组,检查'start'的differnece是否小于或等于1,使用@987654323将逻辑强制转换为二进制@

    library(dplyr)
    df1 %>% 
     mutate(start = as.POSIXct(start, format = '%H:%M')) %>% 
     group_by(household) %>% 
     mutate(indicator = as.integer(any(diff(start) <= 1)))
    # A tibble: 4 x 5
    # Groups:   household [2]
    #  household person mode    start               indicator
    #      <int>  <int> <chr>   <dttm>                  <int>
    #1         1      1 car     2019-09-03 08:00:00         1
    #2         1      2 non-car 2019-09-03 07:30:00         1
    #3         2      1 car     2019-09-03 07:00:00         0
    #4         2      2 non-car 2019-09-03 09:00:00         0
    

    为了得到第二个输出,我们可以使用tidyr的开发版中的pivot_wider

    df1 %>% 
      mutate(startn = as.POSIXct(start, format = '%H:%M')) %>% 
      group_by(household) %>% 
      mutate(indicator = as.integer(any(diff(startn) <= 1))) %>%  
      filter(indicator == 1) %>% 
      select(-startn) %>% 
      group_by(household) %>% 
      mutate(n = row_number()) %>%
      pivot_wider(names_from = n, values_from = c(household, person, mode, start, indicator))
    # A tibble: 1 x 10
    #  household_1 household_2 person_1 person_2 mode_1 mode_2  start_1 start_2 indicator_1 indicator_2
    #        <int>       <int>    <int>    <int> <chr>  <chr>   <chr>   <chr>         <int>       <int>
    #1           1           1        1        2 car    non-car 8:00    7:30              1           1
    

    数据

    df1 <- structure(list(household = c(1L, 1L, 2L, 2L), person = c(1L, 
    2L, 1L, 2L), mode = c("car", "non-car", "car", "non-car"), start = c("8:00", 
    "7:30", "7:00", "9:00")), class = "data.frame", row.names = c(NA, 
    -4L))
    

    【讨论】:

    • 汽车和非汽车选项怎么样?我不匹配2非汽车或2汽车!!!!!!
    • 也给我这个错误:错误:列indicator必须长度为14(组大小)或1,而不是13
    • @shere 让我重新检查一下
    • @shere 在这里,我假设每组只有两行,第二行是非汽车
    • @shere 你能用一个不能用这个代码的例子来更新你的帖子吗?这样,修复起来就更容易了
    猜你喜欢
    • 2015-01-07
    • 2023-01-10
    • 1970-01-01
    • 2023-01-12
    • 2020-02-28
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多