如何按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
相关产品推荐
相关产品推荐

