如何在R中基于唯一ID变量与重置递增变量合并连续行?
解决R中拆分文本按组合并并标识唯一笔记的问题
问题背景
现有如下数据框,因字符限制,完整笔记被拆分为多行NOTE_TEXT子串,同一笔记的子串通过连续的LINE标记(新笔记的LINE从1重新开始)。需要将同一笔记的子串合并为单行,并新增Note字段标识同一ID/Name/Age组合下的唯一笔记:
df <- data.frame(ID = c(1, 1, 2, 2, 2, 2, 2), Name = c("Alice", "Alice", "Bob", "Bob", "Bob", "Bob", "Bob"), Age = c(25, 25, 30, 30, 30, 30, 30), LINE = c(1, 2, 1, 2, 1, 2, 3), NOTE_TEXT = c("This is the fir", "st note", "This is the seco", "nd note", "This is ", "the th", "ird note"))
期望输出:
data.frame(ID = c(1, 2, 2), Name = c("Alice", "Bob", "Bob"), Age = c(25, 30, 30), Note = c(1, 1, 2), NOTE_TEXT = c("This is the first note", "This is the second note", "This is the third note"))
解决方案
无需循环,用dplyr包即可高效处理,核心思路是先识别每个唯一笔记的分组,再合并文本:
- 加载依赖包:
library(dplyr) library(stringr)
- 数据处理:
result_df <- df %>% # 按用户唯一标识分组,生成Note编号 group_by(ID, Name, Age) %>% mutate(Note = cumsum(LINE == 1)) %>% # 按笔记分组,合并对应文本 group_by(ID, Name, Age, Note) %>% arrange(LINE) %>% # 确保按LINE顺序合并子串 summarise(NOTE_TEXT = str_c(NOTE_TEXT, collapse = ""), .groups = "drop")
代码解释
group_by(ID, Name, Age):先按用户的唯一标识分组,确保只在同一用户范围内识别笔记mutate(Note = cumsum(LINE == 1)):每次遇到LINE=1(新笔记的起始行)就累加计数,自动生成唯一的Note编号- 再次分组加入
Note后,用str_c(..., collapse="")按LINE顺序拼接所有子串,得到完整的笔记文本
运行上述代码后,result_df即为期望的结果。
内容的提问来源于stack exchange,提问作者Loudog3232
相关产品推荐
相关产品推荐

