基于含约束数据集构建路由矩阵:用R代码从Stop.Name列生成矩阵A
重构公交路由邻接矩阵A的R实现
嘿,我来帮你搞定这个公交路由矩阵的重构需求!根据你说的,咱们只靠Stop.Name列就能完成——这个列记录了公交一天内途经的站点顺序,正好用来构建站点间的邻接关系矩阵A(也就是路由矩阵,记录哪些站点之间有直接的公交连接)。
下面是具体的实现步骤和代码:
第一步:提取连续的站点配对
首先,我们需要从Stop.Name列里把每一组连续的站点对提取出来。比如如果站点顺序是「站A→站B→站C」,那我们要得到(站A,站B)和(站B,站C)这两组配对。
用基础R实现:
# 假设你的数据框是名为dbus的对象 # 生成连续站点对的数据集:前一个站点是from,后一个是to stop_pairs <- data.frame( from = dbus$Stop.Name[-nrow(dbus)], # 去掉最后一个站点 to = dbus$Stop.Name[-1] # 去掉第一个站点 )
用dplyr包实现(更直观):
如果你习惯用tidyverse系列的工具,用dplyr会更简洁:
library(dplyr) stop_pairs <- dbus %>% mutate( from = lag(Stop.Name), # 把前一行的站点作为from to = Stop.Name # 当前站点作为to ) %>% slice(-1) %>% # 第一行的from是NA,直接去掉 select(from, to) # 只保留需要的两列
第二步:构建路由矩阵A
有了站点配对后,我们就可以把这些关系转换成矩阵了。这个矩阵的行和列都是所有唯一的站点,矩阵中的值可以表示「从行站点到列站点的公交班次次数」,或者只是标记「是否存在直接连接」。
基础R构建完整矩阵:
# 获取所有唯一的站点名称 unique_stops <- unique(dbus$Stop.Name) stop_count <- length(unique_stops) # 初始化一个全0的矩阵,行和列都用站点命名 route_matrix <- matrix( 0, nrow = stop_count, ncol = stop_count, dimnames = list(unique_stops, unique_stops) ) # 遍历站点配对,给对应的矩阵位置赋值(累加次数) for (i in 1:nrow(stop_pairs)) { from_stop <- stop_pairs$from[i] to_stop <- stop_pairs$to[i] route_matrix[from_stop, to_stop] <- route_matrix[from_stop, to_stop] + 1 } # 查看最终的路由矩阵 print(route_matrix)
更简洁的方式(用table函数):
如果只是想快速得到站点间的连接次数,可以直接用table函数:
# 直接生成站点配对的计数表 route_matrix_simple <- table(stop_pairs$from, stop_pairs$to) # 如果需要把所有站点都包含(包括没有任何连接的站点),可以用xtabs扩展: route_matrix_full <- as.matrix( xtabs(~ from + to, data = stop_pairs, subset = from %in% unique_stops & to %in% unique_stops) )
补充说明
- 矩阵中的
route_matrix[X,Y]表示公交从站点X直接开到站点Y的次数,如果你的数据集里有多次同一路线的记录,这个值会自动累加。 - 如果你只需要标记「是否存在连接」,把循环里的
+1改成直接赋值为1就行。 - 如果你的
dbus数据框里有多条不同的公交路线(比如不同日期或不同线路ID),可以先按线路分组再执行上面的步骤,这样就能得到每条线路单独的路由矩阵。
内容的提问来源于stack exchange,提问作者user177196
相关产品推荐
相关产品推荐

