如何选择一组彼此有联系的元素?

时间:2019-07-28 23:20:52

标签: r dataframe

我有一个家庭专栏。我还有一个供家庭成员使用,还有另一个专栏供他们选择旅行方式。此列是1或2。如果一个人是驾驶员,则为1;如果一个人是乘客,则为2。我已经确定谁是哪个乘客的司机。因此,我需要使用其他信息来确定这一点。我有一栏用于开始时间,一栏用于行程时间。因此,如果驾驶员i的起步时间和持续时间相同,则驾驶员i会为其乘车。如果处理2列比较复杂,则开始时间就足够了。

这是一个例子

    Household    person   mode    start_time      duration_time
       1           1        1          8:25              10
       1           1        1          16:00             20
       1           2        2          8:25              10
       1           3        2          16:00             20
       2           1        1          15:00              4
       2           1        2          20:00              20
       2           2        2          15:00              4
       2           2        1          20:00              20

所以我需要一些东西来表明与驾驶员在同一行中的乘客索引。乘客的行可以只是这样的乘客本身的索引:

    Household    person   mode    start_time      duration_time passenger
       1           1        1          8:25              10.       2
       1           1        1          16:00             20        3
       1           2        2          8:25              10        2
       1           3        2          16:00             20        3
       2           1        1          15:00              4        2
       2           1        2          20:00              20.      1
       2           2        2          15:00              4        2
       2           2        1          20:00              20       1

或者可以消除那排乘客,而我们有

    Household    person   mode.    start time.      duration time. passenger
       1           1        1          8:25              10.       2
       1           1        1          16:00             20        3
       2           1        1          15:00              4        2
       2           2        1          20:00              20       1

有什么帮助吗?

如果我有旅程编号并且想保留乘客的旅程编号怎么办?

    Household    person  mode    start_time      duration_time trip
       1           1        1          8:25              10.       1 
       1           1        1          16:00             20        2
       1           2        2          8:25              10        1
       1           3        2          16:00             20        1
       2           1        1          15:00              4        1
       2           1        2          20:00              20.      2
       2           2        2          15:00              4        1
       2           2        1          20:00              20       2

和输出

    Household    person   mode.    start time.      duration time. passenger  trip 
       1           1        1          8:25              10.           2       1
       1           1        1          16:00             20            3       1
       2           1        1          15:00              4              2       2
       2           2        1          20:00              20             1       1

2 个答案:

答案 0 :(得分:2)

鉴于目前提供的数据,这是我对您的建议。您的数据称为mydf。请注意,start_time现在是字符。我使用Householdstart_timeduration_time定义了组。然后,我创建了一个包含person的字符串。字符串中的第一个数字表示驱动程序。如有必要,您想要修改最终结果。

library(tidyverse)

group_by(mydf, Household, start_time, duration_time) %>%
summarize(person = paste(person[order(mode)], collapse = "-")) %>%
ungroup

# A tibble: 4 x 4
#  Household start_time duration_time person
#      <int> <chr>              <int> <chr> 
#1         1 16:00                 20 1-3   
#2         1 8:25                  10 1-2   
#3         2 15:00                  4 1-2   
#4         2 20:00                 20 2-1    

数据

mydf <- structure(list(Household = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), 
person = c(1L, 1L, 2L, 3L, 1L, 1L, 2L, 2L), mode = c(1L, 
1L, 2L, 2L, 1L, 2L, 2L, 1L), start_time = c("8:25", "16:00", 
"8:25", "16:00", "15:00", "20:00", "15:00", "20:00"), duration_time = c(10L, 
20L, 10L, 20L, 4L, 20L, 4L, 20L)), class = "data.frame", row.names = c(NA, 
-8L))

答案 1 :(得分:1)

我们可以group_by Householdstart_timeduration_time,然后在每个组中分别选择personmode == 1来选择mode == 2

library(dplyr)

df %>%
  group_by(Household,start_time, duration_time) %>%
  summarise(passenger = person[mode == 2], 
            person = person[mode == 1]) %>%
  mutate(mode = 1)

#  Household start_time duration_time passenger person  mode
#      <int> <chr>              <int>     <int>  <int> <dbl>
#1         1 16:00                 20         3      1     1
#2         1 8:25                  10         2      1     1
#3         2 15:00                  4         2      1     1
#4         2 20:00                 20         1      2     1