R语言DataFrame处理:根据前后行骑行站点匹配删除当前行
R实现DataFrame按相邻行条件过滤的方案
核心逻辑
我们只需要判断每行的end_station_name是否和下一行的start_station_name相等,保留不相等的行即可,最后一行无下一行默认保留。
方法1:dplyr实现(适合tidyverse技术栈,可读性高)
测试数据构造
df <- data.frame( ride = 1:5, start_station_name = c("A", "B", "C", "M", "K"), end_station_name = c("B", "C", "D", "N", "L") )
过滤代码
library(dplyr) df_result <- df %>% filter(end_station_name != lead(start_station_name, default = ""))
lead()函数会提取当前行的下一行对应列的值,default参数设置最后一行的下一行默认值为空字符串,保证最后一行始终保留。
方法2:data.table实现(适合超大型数据集,性能最优)
library(data.table) setDT(df) # 转换为data.table格式 df_result <- df[end_station_name != shift(start_station_name, type = "lead", fill = "")]
方法3:基础R实现(无需加载第三方包)
# 生成保留行的逻辑向量,最后一位默认设为TRUE keep_flag <- c(df$end_station_name[-nrow(df)] != df$start_station_name[-1], TRUE) df_result <- df[keep_flag, ]
注意事项
如果数据包含多个用户的骑行记录,需要先按用户ID、骑行时间排序后分组再执行过滤,避免跨用户的相邻记录误判,示例(dplyr版本):
df_result <- df %>% arrange(user_id, ride_time) %>% group_by(user_id) %>% filter(end_station_name != lead(start_station_name, default = "")) %>% ungroup()
内容的提问来源于stack exchange,提问作者GuiW
相关产品推荐
相关产品推荐

