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

R语言按随机标题分组合并Start与Stop标记间字符串的实现方法

实现思路

你之前的方法只做了内容块分组,没有先做标题归属分组,我们可以按照「先标记标题分配归属、再拆分标题下的内容块」两步处理:

  1. 先识别所有标题行,给每个标题分配唯一ID,同个标题后的所有内容都绑定到对应ID下
  2. 每个标题分组内跳过标题本身,按Start出现次数拆分内容块,合并每个Start到Stop的字符串为向量
  3. 最终转换为要求的命名嵌套列表结构

可直接运行的代码

library(tidyverse)

# 你的示例输入向量
chr_vec <- c("Random Title", "Start", "dsf", "sdvf", "Stop", "Start", "dsf", "sdvf", "Stop", "Start", "dsf", "sdvf", "Stop", "Another Random Title", "Start", "erg", "vdf", "vfd", "efw", "Stop",
             "Start", "erg", "vdf", "vfd", "efw", "Stop", "Start", "erg", "vdf", "vfd", "efw", "Stop")

result <- tibble(text = chr_vec) %>%
  # 标记标题:既不是Start/Stop,且前一个元素是Stop(适配开头第一个元素为标题的场景)
  mutate(is_title = !text %in% c("Start", "Stop") & lag(text, default = "Stop") == "Stop",
         # 给每个标题分配唯一ID,同标题下的所有内容共享该ID
         title_id = cumsum(is_title)) %>%
  group_by(title_id) %>%
  summarise(
    # 提取当前分组的标题名
    title_name = first(text),
    # 处理当前标题下的所有内容块
    blocks = list(
      tibble(content = text[-1]) %>%
        # 按Start出现次数给内容块编号
        mutate(block_id = cumsum(content == "Start")) %>%
        filter(block_id > 0) %>%
        group_by(block_id) %>%
        # 合并每个块的所有字符串为向量
        summarise(block_vec = list(content)) %>%
        pull(block_vec)
    )
  ) %>%
  # 转换为要求的命名嵌套列表结构
  pull(blocks, name = title_name)

输出验证

运行代码后得到的result结构和你要求的完全一致:

> str(result)
List of 2
 $ Random Title        :List of 3
  ..$ : chr [1:4] "Start" "dsf" "sdvf" "Stop"
  ..$ : chr [1:4] "Start" "dsf" "sdvf" "Stop"
  ..$ : chr [1:4] "Start" "dsf" "sdvf" "Stop"
 $ Another Random Title:List of 3
  ..$ : chr [1:6] "Start" "erg" "vdf" "vfd" ...
  ..$ : chr [1:6] "Start" "erg" "vdf" "vfd" ...
  ..$ : chr [1:6] "Start" "erg" "vdf" "vfd" ...

注:你示例期望输出里Random Title只写了2个块属于笔误,实际输入对应3个块,代码会按实际输入自动适配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:15:03