按Group ID分组后截取每组第1、5、10…行的dplyr实现方案
dplyr分组筛选指定行实现方案
你可以通过组内行号匹配规则实现筛选,以下两种写法均完全兼容dplyr生态:
方法1:结合row_number()与filter()(可读性更强)
先为每个分组生成独立的行号后按规则筛选,适合需要保留行号做后续操作的场景:
library(dplyr) result <- your_data %>% group_by(`Group ID`) %>% # 按分组字段分组 mutate(group_inner_row = row_number()) %>% # 生成组内连续行号 filter(group_inner_row == 1 | group_inner_row %% 5 == 0) %>% # 匹配第1行、5的倍数行 ungroup() # 可选:筛选完成后取消分组状态 # 若不需要保留组内行号列,可新增select(-group_inner_row)移除
方法2:直接调用slice()实现(代码更简洁)
你之前使用slice失败大概率是未提前分组,导致行号是全表维度而非组内维度,正确写法如下:
library(dplyr) result <- your_data %>% group_by(`Group ID`) %>% slice(1, seq(from = 5, to = n(), by = 5)) %>% # 直接指定取第1行、5开头步长5的行 ungroup()
注意事项
- 写法中
n()会自动读取每个分组的总行数,不会出现索引越界问题 - 两种写法均兼容dplyr 1.0.0及以上版本,同时支持dbplyr对接的远程数据库表操作
内容的提问来源于stack exchange,提问作者Cam
相关产品推荐
相关产品推荐

