如何在R中按指定文本序列向下填充至下一个指定文本?
解决方案
方法1:Base R 原生实现
核心思路是先标记出所有作为"分组标签"的行,生成分组ID后,按组填充对应标签值。
假设你的标签列表是 c("Potter", "Wisley", "Granger"),代码如下:
# 定义需要作为填充源的标签列表 tags <- c("Potter", "Wisley", "Granger") # 生成分组ID:每遇到一个标签行,分组序号+1 dat0$group <- cumsum(dat0$text %in% tags) # 按分组填充new_text,取每组的第一个值(即标签值)向下覆盖 dat0$new_text <- ave(dat0$text, dat0$group, FUN = function(x) x[1])
如果标签有固定格式(比如都是首字母大写的英文单词,而非标签是随机字符/数字组合),可以用正则表达式自动识别标签行:
# 用正则匹配首字母大写、其余小写的英文单词作为标签 dat0$group <- cumsum(grepl("^[A-Z][a-z]+$", dat0$text)) dat0$new_text <- ave(dat0$text, dat0$group, FUN = function(x) x[1])
方法2:Tidyverse 简洁实现
借助dplyr的条件赋值和tidyr的填充函数,代码更直观:
library(dplyr) library(tidyr) tags <- c("Potter", "Wisley", "Granger") dat0 <- dat0 %>% # 仅保留标签行的text值,其余行设为NA mutate(new_text = ifelse(text %in% tags, text, NA)) %>% # 向下填充NA值,用上方最近的标签值覆盖 fill(new_text, .direction = "down")
同样支持正则识别标签的写法:
dat0 <- dat0 %>% mutate(new_text = ifelse(grepl("^[A-Z][a-z]+$", text), text, NA)) %>% fill(new_text, .direction = "down")
大规模数据适配说明
两种方法都能高效处理pdftools::pdf_data生成的数千行数据集:
- Base R的
cumsum和ave是原生向量化函数,性能无压力 - Tidyverse的方法依赖包,但
dplyr的向量化操作在大样本下也能快速运行
结果验证
运行代码后,数据框会生成预期的new_text列,示例输出如下:
> dat0 text new_text group 1 Potter Potter 1 2 hj7d Potter 1 3 kl8ep Potter 1 4 f3d Potter 1 5 rtyzs2 Potter 1 6 Wisley Wisley 2 7 lq6s Wisley 2 8 2fg Wisley 2 9 Granger Granger 3 10 r8ka Granger 3 11 h9 Granger 3 12 qm9ne Granger 3
内容的提问来源于stack exchange,提问作者denis
相关产品推荐
相关产品推荐

