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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 15:05:16