我有一个家庭专栏。我还有一个供家庭成员使用,还有另一个专栏供他们选择旅行方式。此列是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
答案 0 :(得分:2)
鉴于目前提供的数据,这是我对您的建议。您的数据称为mydf
。请注意,start_time
现在是字符。我使用Household
,start_time
和duration_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
Household
,start_time
和duration_time
,然后在每个组中分别选择person
和mode == 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