R语言实现数据框连续同名title分组 拼接对应text列值
问题根因
你原有代码无法得到预期结果,核心问题有两点:
- 开头的
filter(title %in% sample(unique(title)))逻辑是对title做随机抽样筛选,会随机丢失数据,和保留全量数据、保留原始顺序的需求完全无关 - 直接使用
group_by(title)是对全局所有同名title做聚合,会把不连续出现的同名title(比如示例中D前后的两段C)错误合并,不符合「非连续同名不跨组合并」的要求
实现方案
要实现连续相同值分组,核心是先构造连续分组标识:当当前行title和上一行title不一致时,分组序号累加1,用这个标识区分开不连续的同名分组,再做聚合即可。
dplyr原生实现
不需要额外依赖其他包,直接用dplyr内置函数即可实现:
library(dplyr) result <- df %>% # 生成连续分组ID:当前title和上一行不同时组号+1 mutate(group_id = cumsum(title != lag(title, default = first(title)))) %>% # 按连续分组ID和title分组,保证同组都是连续出现的相同title group_by(group_id, title) %>% summarise( # 如果需要统计每组text数量,取消下面这行注释即可 # text_count = n(), text = paste(unique(text), collapse = " "), .groups = "drop" ) %>% # 移除辅助分组ID列,保留需要的输出字段 select(title, text)
更简便的实现(借助data.table的rleid函数)
如果安装了data.table包,可以用专门为连续相同值生成分组ID的rleid()函数,代码更简洁:
library(dplyr) result <- df %>% group_by(group_id = data.table::rleid(title), title) %>% summarise( text = paste(unique(text), collapse = " "), .groups = "drop" ) %>% select(title, text)
输出验证
用你提供的示例数据运行上述代码,得到的结果和预期完全一致:
title text <chr> <chr> 1 A I like... 2 B I wish... 3 C review1 review2 review3 4 D Detecting... 5 C review1 review2 6 E New...
内容的提问来源于stack exchange,提问作者Ranji Raj
相关产品推荐
相关产品推荐

