R语言dplyr按name分组筛选:单观测保留、多观测取第2条
问题需求
待处理数据表包含name、user_id、session_id三个字段,session_id已按会话游玩时间升序排列,筛选规则如下:
- 按
name字段分组 - 单组仅1条记录时直接保留
- 单组有多条记录时,仅保留组内排序后的第2条记录
预期输出匹配:e_1对应session_id=102、e_2对应session_id=105、e_3对应session_id=107,e_4、e_5保留原有单条记录。
原代码问题
原写法报错的核心问题是if_else是向量运算函数,无法直接对整表做分支流程控制,也不能把filter这类数据操作函数直接作为if_else的返回值,属于函数使用场景不匹配。另外arrange(name)属于冗余操作,分组后取行的逻辑和name本身的排序无关。
正确实现
最简洁的写法用dplyr的slice函数按组取行即可:
library(dplyr) new_table <- old_table %>% group_by(name) %>% # 组内行数为1取第1行,否则取第2行 slice(if(n() == 1) 1L else 2L) %>% ungroup()
如果要沿用之前尝试的filter+row_number逻辑,可使用如下等价写法:
new_table <- old_table %>% group_by(name) %>% filter(if_else(n() == 1, row_number() == 1, row_number() == 2)) %>% ungroup()
补充:如果无法确认原表
session_id的升序顺序,可在group_by后添加arrange(session_id, .by_group = TRUE),保证组内按游玩时间排序后再取数,避免顺序错乱。
内容的提问来源于stack exchange,提问作者Eman
相关产品推荐
相关产品推荐

