R中用rleid聚合生成trip_id行程表后如何关联添加vehicle_id列
行程关联车辆标识的实现方案
针对你基于轨迹划分独立行程、需要为每个trip_id条目关联对应车辆标识(输出列名为from_vehicle_id)的需求,可直接复用你当前使用的dplyr + data.table技术栈实现,不需要引入额外第三方工具,具体可根据你的流程进度选择对应实现方式:
- 方案1(优先推荐,零冗余计算):在现有聚合链路中直接提取字段。你使用
rleid()划分连续载客状态段时,本身是按单车辆的行驶轨迹做切段,每个分组的vehicle_id是唯一确定的,只需在聚合的summarise()逻辑中新增一行字段提取代码,直接将该分组的vehicle_id重命名为from_vehicle_id即可,不需要后续跨表匹配。 - 方案2(适配已生成初步聚合结果的场景):如果已经跑完聚合流程、得到不带vehicle_id的行程表,可使用dplyr包的
left_join()函数,以「车辆标识、连续状态分组编号」为匹配键,关联原始轨迹表中对应的vehicle_id字段,重命名为from_vehicle_id完成匹配;熟悉data.table语法的话,也可以用data.table包自带的表关联语法实现相同效果。
注意:运行
rleid()生成状态段编号时,必须嵌套在按vehicle_id分组的逻辑下调用,否则不同车辆的同载客状态轨迹会被错误合并为同一个行程段,从根源上避免关联字段错配的问题。
配套流程代码示例
结合你提到的现有处理流程,可直接在原有代码中插入对应字段提取逻辑:
library(dplyr) library(data.table) traj_data %>% # 先按车辆分组,为rleid的计算划定边界,避免跨车错分 group_by(vehicle_id) %>% # 为连续相同载客状态生成唯一分组编号 mutate(status_group = rleid(for_hire_light)) %>% # 按车辆、状态分组编号聚合行程基础信息 group_by(vehicle_id, status_group) %>% summarise( start_location = first(location), end_location = last(location), start_time = first(time), end_time = last(time), for_hire_light = first(for_hire_light), # 直接提取当前分组的车辆标识,命名为要求的from_vehicle_id from_vehicle_id = first(vehicle_id), .groups = "drop" ) %>% # 筛选载客状态为0的有效行程段 filter(for_hire_light == 0) %>% # 生成连续唯一的trip_id mutate(trip_id = row_number())
内容的提问来源于stack exchange,提问作者Yasumin
相关产品推荐
相关产品推荐

