从 DF 在 R 中创建 O/D table
Make an O/D table in R from a DF
大家晚上好。
我在基于我的 DF 创建 O/D 时遇到了一些问题。
我的 DF 有行程编号、每个站点的索引、每个站点的出发时间和站点名称:
Trip Index Time OD
16 1 a A
16 10 b B
16 20 c C
32 1 d B
32 9 e A
32 13 f C
32 24 g D
我需要 O/D table,其中我有 Origin 的停止名称 |目的地站名 |每个连接的出发时间(DF 中的时间):
O D Time
A B a
A C a
B C b
B A d
B C d
B D d
A C e
A D e
C D f
以第一次旅行为例。它从“A”站开始,到“C”站结束,经过“B”站。因此,对于“A”的乘客,他们在“a”时间开始前往“B”的旅程,同时在“a”开始前往“C”的旅程。对于“B”的乘客,他们在时间“b”开始前往“C”的旅程。从“C”出发,这次旅行哪儿也去不了。然后我们必须看到下一次旅行。等等。
我已经开始尝试使用“for”循环,如果在 for 中开始比较第一行的第一行与第二行和第三行,然后将第一行的第二行与第三行进行比较,而不是传递到下一个行程,因为没有第 4 条腿。至少这是我的理由,不知道是否清楚或是否有道理。
谢谢!
试试这个,使用一个简单的辅助函数:
library(dplyr)
odfunc <- function(tm, od) {
mtx <- t(combn(length(od), 2))
tibble::tibble(O = od[mtx[,1]], D = od[mtx[,2]], Time = tm[mtx[,1]])
}
df %>%
group_by(Trip) %>%
do(with(., odfunc(Time, OD))) %>%
ungroup()
# # A tibble: 9 x 4
# Trip O D Time
# <int> <chr> <chr> <chr>
# 1 16 A B a
# 2 16 A C a
# 3 16 B C b
# 4 32 B A d
# 5 32 B C d
# 6 32 B D d
# 7 32 A C e
# 8 32 A D e
# 9 32 C D f
数据:
df <- read.table(header=TRUE, text="
Trip Index Time OD
16 1 a A
16 10 b B
16 20 c C
32 1 d B
32 9 e A
32 13 f C
32 24 g D")
大家晚上好。 我在基于我的 DF 创建 O/D 时遇到了一些问题。 我的 DF 有行程编号、每个站点的索引、每个站点的出发时间和站点名称:
Trip Index Time OD
16 1 a A
16 10 b B
16 20 c C
32 1 d B
32 9 e A
32 13 f C
32 24 g D
我需要 O/D table,其中我有 Origin 的停止名称 |目的地站名 |每个连接的出发时间(DF 中的时间):
O D Time
A B a
A C a
B C b
B A d
B C d
B D d
A C e
A D e
C D f
以第一次旅行为例。它从“A”站开始,到“C”站结束,经过“B”站。因此,对于“A”的乘客,他们在“a”时间开始前往“B”的旅程,同时在“a”开始前往“C”的旅程。对于“B”的乘客,他们在时间“b”开始前往“C”的旅程。从“C”出发,这次旅行哪儿也去不了。然后我们必须看到下一次旅行。等等。
我已经开始尝试使用“for”循环,如果在 for 中开始比较第一行的第一行与第二行和第三行,然后将第一行的第二行与第三行进行比较,而不是传递到下一个行程,因为没有第 4 条腿。至少这是我的理由,不知道是否清楚或是否有道理。
谢谢!
试试这个,使用一个简单的辅助函数:
library(dplyr)
odfunc <- function(tm, od) {
mtx <- t(combn(length(od), 2))
tibble::tibble(O = od[mtx[,1]], D = od[mtx[,2]], Time = tm[mtx[,1]])
}
df %>%
group_by(Trip) %>%
do(with(., odfunc(Time, OD))) %>%
ungroup()
# # A tibble: 9 x 4
# Trip O D Time
# <int> <chr> <chr> <chr>
# 1 16 A B a
# 2 16 A C a
# 3 16 B C b
# 4 32 B A d
# 5 32 B C d
# 6 32 B D d
# 7 32 A C e
# 8 32 A D e
# 9 32 C D f
数据:
df <- read.table(header=TRUE, text="
Trip Index Time OD
16 1 a A
16 10 b B
16 20 c C
32 1 d B
32 9 e A
32 13 f C
32 24 g D")