基于heading 1为officer提取的Word文本行分配段落组编号
给Word提取文本按标题分组分配编号
问题场景
用officer包提取Word文档文本后得到如下数据框:
df <- data.frame(style_name = c("heading 1", "para 1", "para 1", "para 1", "heading 1", "para 1", "para 1", "heading 1", "para 1", "heading 1", "para 1"), text = c("Introduction", "Some", "Intro", "Wording", "Background", "Some more", "wording to suit", "Another heading", "and paragraph wording", "Final Heading", "Closing words go here"))
数据框内容:
style_name text 1 heading 1 Introduction 2 para 1 Some 3 para 1 Intro 4 para 1 Wording 5 heading 1 Background 6 para 1 Some more 7 para 1 wording to suit 8 heading 1 Another heading 9 para 1 and paragraph wording 10 heading 1 Final Heading 11 para 1 Closing words go here
需要给每个以heading 1开头到下一个heading 1前的行分配统一的section_group编号,最终得到包含分组编号的数据框。
解决方案
核心逻辑是识别所有style_name为heading 1的行,对这些行的位置做累加计数,后续段落行自动继承当前计数,直到下一个标题行出现时计数递增。提供两种实现方式:
方法1:基础R实现
# 生成分组编号 df$section_group <- cumsum(df$style_name == "heading 1")
方法2:dplyr包实现(适合管道式操作)
library(dplyr) df <- df %>% mutate(section_group = cumsum(style_name == "heading 1"))
效果验证
运行后得到目标结果:
style_name text section_group 1 heading 1 Introduction 1 2 para 1 Some 1 3 para 1 Intro 1 4 para 1 Wording 1 5 heading 1 Background 2 6 para 1 Some more 2 7 para 1 wording to suit 2 8 heading 1 Another heading 3 9 para 1 and paragraph wording 3 10 heading 1 Final Heading 4 11 para 1 Closing words go here 4
逻辑说明
cumsum(df$style_name == "heading 1")会将每个标题行标记为1,非标题行标记为0,累加求和后:每遇到一个标题行,计数就加1,后续的段落行会持续使用当前计数,直到下一个标题行出现时计数再次递增,完美实现分组编号需求。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

