R语言如何筛选grp非连续递增1的完整Sequ分组数据
问题说明
现有包含分组变量Sequ、计数变量grp的数据框,示例数据构造代码如下:
df <- data.frame( Sequ = c(1,1,2,2,2,2,3,3,3,4,4,4,4), grp = c(1,2, 1,3,4,5, 1,2,3, 1,2,4,5) )
需求为筛选grp序列存在相邻项增量大于1(即非逐次加1连续编号)的所有Sequ分组对应的完整行数据。
原有dplyr代码仅能定位到序列断点所在行,无法返回对应Sequ分组的全部数据,原代码及运行结果如下:
df %>% group_by(Sequ) %>% filter(lead(grp) - grp > 1) # A tibble: 2 × 2 # Groups: Sequ [2] Sequ grp <dbl> <dbl> 1 2 1 2 4 2
期望输出为所有存在编号断点的Sequ分组的全部行,结果如下:
Sequ grp 1 2 1 2 2 3 3 2 4 4 2 5 5 4 1 6 4 2 7 4 4 8 4 5
实现方法
原有代码的问题是filter中使用的是行级判断,仅会保留满足相邻差值大于1的单行。只要把判断逻辑改为分组级判断:只要组内存在任意一处相邻grp差值大于1,就保留该组全部行即可。
调整后的代码如下:
library(dplyr) df %>% group_by(Sequ) %>% filter(any(lead(grp) - grp > 1, na.rm = TRUE)) %>% ungroup()
关键逻辑说明:
lead(grp) - grp > 1:逐行计算当前行与下一行grp的差值是否大于1,每个分组最后一行无后续值,会返回NAany(..., na.rm = TRUE):判断当前分组内是否存在至少一处差值大于1的情况,na.rm = TRUE用于排除最后一行生成的NA对判断结果的干扰- 最终
filter会保留所有满足判断条件的分组的全部行,运行后即可得到期望输出。
内容的提问来源于stack exchange,提问作者Chris Ruehlemann
相关产品推荐
相关产品推荐

