如何在R中过滤含缺失观测的公交数据并删除后续指定记录
解决公交行程缺失站点后删除后续指定记录的R实现
以下是基于tidyverse的简洁实现方案,针对需求——当行程中出现缺失站点时,删除该缺失站点后的指定数量(可灵活调整)记录:
模拟数据
首先生成符合场景的模拟数据,包含2个独立行程(用trip_id区分),存在站点缺失:
library(tidyverse) set.seed(123) df <- tibble( trip_id = rep(c(1, 2), each = 15), stop = c(5,6,7,8,10,11,12,13,14,15,16,17,19,20,21, # 行程1缺失站点9、18 5,6,8,9,10,11,12,13,15,16,17,18,19,20,21) # 行程2缺失站点7 )
核心实现代码
# 定义缺失站点后需要删除的后续记录数量(可灵活调整) n_delete <- 3 processed_df <- df %>% group_by(trip_id) %>% arrange(stop) %>% mutate( # 生成该路线的理想站点序列(5至20) ideal_stops = list(5:20), # 找出当前行程缺失的站点 missing_stops = list(setdiff(ideal_stops[[1]], stop)), # 计算每个缺失站点后需要删除的站点范围:从缺失站+1开始,连续n_delete个(不超过20) to_remove = list(unlist(map(missing_stops[[1]], ~ seq(.x + 1, min(.x + n_delete, 20))))) ) %>% # 保留不在删除列表中的记录,且仅保留理想序列内的站点 filter(!stop %in% to_remove[[1]] & stop %in% ideal_stops[[1]]) %>% # 清理辅助计算列 select(-ideal_stops, -missing_stops, -to_remove) %>% ungroup() # 查看处理结果 print(processed_df)
代码逻辑说明
- 分组处理:按
trip_id分组,确保每个行程的缺失站点判断独立进行 - 识别缺失站点:对比理想站点序列(5-20)和当前行程实际存在的站点,找出缺失值
- 标记删除范围:对每个缺失站点,计算后续需要删除的连续
n_delete个站点(上限为20,避免超出路线站点范围) - 过滤记录:保留不在删除范围内的站点,同时剔除理想序列外的无效站点(比如示例中的21)
结果验证
- 行程1中缺失9和18,会删除10-12、19-20,最终保留站点:5,6,7,8,13,14,15,16,17
- 行程2中缺失7,会删除8-10,最终保留站点:5,6,11,12,13,15,16,17,18,19,20
内容的提问来源于stack exchange,提问作者OLGJ
相关产品推荐
相关产品推荐

