You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 13:15:48