R语言中合并两行:将无数字前缀行内容拼至上一行指定列
处理OCR跨行子标题的R解决方案
针对OCR归档中遇到的子标题跨行问题(非标题行需拼接至上一行标题),可以通过以下两种方式实现:
方法一:使用dplyr包(简洁直观)
library(dplyr) # 原始数据 df <- data.frame(header = c("1. hello", "2. halo", "hallow"), line_id = c(28:30), stringsAsFactors = FALSE) # 标记标题行并创建分组 df_processed <- df %>% mutate( is_header = grepl("^\\d+\\.", header), # 判断是否为开头带数字+点的标题行 group = cumsum(is_header) # 为每个标题及后续跨行内容分配分组 ) # 按分组拼接内容并提取原始行号 df_clean <- df_processed %>% group_by(group) %>% summarise( header = paste(header, collapse = " "), line_id = first(line_id) ) %>% ungroup() %>% select(-group) # 输出结果 df_clean
方法二:基础R实现(无需额外依赖)
# 原始数据 df <- data.frame(header = c("1. hello", "2. halo", "hallow"), line_id = c(28:30), stringsAsFactors = FALSE) # 定位所有标题行的位置 header_rows <- which(grepl("^\\d+\\.", df$header)) # 为每行分配对应的分组 groups <- findInterval(seq_len(nrow(df)), header_rows) # 遍历分组处理内容 df_clean <- do.call(rbind, lapply(unique(groups), function(g) { group_data <- df[groups == g, ] data.frame( header = paste(group_data$header, collapse = " "), line_id = group_data$line_id[1], stringsAsFactors = FALSE ) })) # 输出结果 df_clean
核心逻辑说明
- 用正则表达式
^\\d+\\.匹配开头为数字加英文点的标题行; - 通过分组将每个标题行与其后续的跨行内容绑定;
- 对每个分组内的
header字段进行字符串拼接,保留分组内第一个line_id作为原始行标识。
内容的提问来源于stack exchange,提问作者stacksterppr
相关产品推荐
相关产品推荐

