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

如何在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包即可高效处理,核心思路是先识别每个唯一笔记的分组,再合并文本:

  1. 加载依赖包:
library(dplyr)
library(stringr)
  1. 数据处理:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 19:53:32