使用dplyr的lag/lead匹配多列字符内容实现数据框行筛选
R语言tidyverse实现多文本列相邻行比对筛选方案
实现方法
完全可以使用tidyverse工具链实现该需求,以下提供两种适配不同场景的实现方案:
方案1:分组取尾行(逻辑最简洁,推荐)
你的需求本质是对col1、col2、col3三个列值完全相同的分组,保留每组的最后一行,直接用group_by+slice_tail即可实现,天然支持文本类型列的匹配,不需要额外转换:
library(tidyverse) df_result <- df %>% # 按需要匹配的三个列分组 group_by(col1, col2, col3) %>% # 取每组最后1行 slice_tail(n = 1) %>% # 取消分组,避免后续操作受分组影响 ungroup()
该方案适配所有连续/非连续的同值分组场景,执行效率高,逻辑清晰不容易出错。
方案2:相邻行逐行比对(严格匹配描述规则)
如果你需要严格遵循「仅比对当前行与下一行,相同则删除当前行」的逻辑(比如存在非连续的同值分组不需要合并的场景),可以用lead函数实现多列同时匹配,文本列直接用==判断即可:
library(tidyverse) df_result <- df %>% filter( # 仅保留「和下一行三个列不完全相同」或者「已经是最后一行」的记录 !(col1 == lead(col1) & col2 == lead(col2) & col3 == lead(col3)) | is.na(lead(col1)) )
以上两种方案运行后得到的结果均与给出的期望输出完全一致。
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

