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

如何按Id分组折叠列中重复值并保留事件顺序?

解决分组后保留非连续重复事件的问题

哈哈,我太懂这种困惑了!distinct()和unique()是全局去重,会把所有重复的event都删掉,自然会丢掉Id=1里第三次出现的A——但你要的是去掉每个Id组内连续重复的event,不连续的重复得保留,对吧?

给你两种常用的解决方案,都是R里的常规操作:

方法一:用dplyr实现(tidyverse风格)

先加载dplyr包,然后按Id分组,过滤掉和前一行event相同的记录就行:

library(dplyr)

# 先构造你的原始数据框
df <- data.frame(
  Id = c(1,1,1,1,2,2,2),
  event = c("A","B","A","A","C","C","A")
)

# 核心处理逻辑
result_df <- df %>%
  group_by(Id) %>%
  # 用lag取前一行的event,第一行默认空字符串,所以肯定保留
  filter(event != lag(event, default = "")) %>%
  ungroup()

# 查看结果
print(result_df)

运行后得到的结果就是你想要的:

# A tibble: 5 × 2
     Id event
  <dbl> <chr>
1     1 A    
2     1 B    
3     1 A    
4     2 C    
5     2 A    

方法二:用data.table实现(更高效,适合大数据)

如果你的数据量很大,data.table的rleid()函数会更高效,它能给连续相同的event分配唯一的分组id:

library(data.table)

# 转成data.table格式
setDT(df)

# 按Id和连续event分组,取每组第一行,最后去掉临时分组列
result_dt <- df[, .SD[1], by = .(Id, rleid(event))][, -"rleid"]
# 调整列顺序和原始数据一致
setcolorder(result_dt, c("Id", "event"))

# 查看结果
print(result_dt)

这个方法得到的结果和上面完全一样,处理大数据时速度会快很多。

本质上这两种方法都是只剔除连续重复的记录,保留了事件的顺序和非连续的重复值,完美匹配你的需求~

内容的提问来源于stack exchange,提问作者Tim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:56:21