R 如何挑选一个团队中相互之间有某种关系的某些元素?

R 如何挑选一个团队中相互之间有某种关系的某些元素?,r,dataframe,R,Dataframe,我有一个家庭专栏。我还有一个家庭成员专栏,另一个专栏介绍他们的旅行方式。此列为1或2。1人是驾驶员,2人是乘客。我已经确定谁是哪个乘客的司机。所以,我需要使用其他信息来确定这一点。我有一个关于开始时间的栏和一个关于旅行持续时间的栏。因此,如果乘客j的启动时间和持续时间相同,司机i会让乘客j搭车。如果使用2列很复杂,那么开始时间就足够了 这里有一个例子 Household person mode start_time duration_time 1

我有一个家庭专栏。我还有一个家庭成员专栏,另一个专栏介绍他们的旅行方式。此列为1或2。1人是驾驶员,2人是乘客。我已经确定谁是哪个乘客的司机。所以,我需要使用其他信息来确定这一点。我有一个关于开始时间的栏和一个关于旅行持续时间的栏。因此,如果乘客j的启动时间和持续时间相同,司机i会让乘客j搭车。如果使用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       1
       2           2        1          20:00              20             1       2

鉴于目前提供的数据,我向您提出以下建议。您的数据称为
mydf
。请注意,
start\u 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    
资料


mydf2我们可以
根据
家庭
开始时间
持续时间
进行分组,并在每组中选择
个人
,模式==1
模式==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
库(dplyr)
df%>%
分组依据(家庭、开始时间、持续时间)%>%
总结(乘客=人[模式==2],
人员=人员[模式==1])%>%
变异(模式=1)
#家庭开始时间持续时间乘客模式
#                             
#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

如果第一个数字是司机,第二个家庭的第二个乘客,行程从20:00开始,第二个是司机,第一个是乘客,我们应该有2个-1@akrun好久不说话了。谢谢你的评论。我正在做我的工作,我无法回复你。我想这就是OP的要求。我修改了代码以反映OP所说的内容。我们将看看这是否足够。@sherek_66如果您能提供一个样本数据,我很乐意帮助您。但我可以在工作之后再做。@sherek_66为什么家庭2的输出中有1和2(行程编号)相反?考虑到您提供的数据,这似乎不一致。我看不出你的逻辑。@sherek_66我补充了一个建议。希望这对你有帮助。我要去睡觉了。如果你需要进一步的帮助,你要考虑问另一个问题。还有一件事。你要详细地写下你的问题。否则,用户不会清楚地知道您想要什么。
group_by(mydf2, Household, start_time, duration_time) %>%
summarize(person = paste(person[order(mode)], collapse = "-"),
          trip = trip[mode == 2]) %>%
ungroup

# A tibble: 4 x 5
#  Household start_time duration_time person  trip
#      <int> <chr>              <dbl> <chr>  <int>
#1         1 16:00                 20 1-3        1
#2         1 8:25                  10 1-2        1
#3         2 15:00                  4 1-2        1
#4         2 20:00                 20 2-1        2
mydf2 <- 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(10, 
20, 10, 20, 4, 20, 4, 20), trip = c(1L, 2L, 1L, 1L, 1L, 2L, 
1L, 2L)), class = "data.frame", row.names = c(NA, -8L))
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