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

如何将str_extract函数应用于表格单元格区域并保留原数据框?

解决R中批量正则提取数据框指定区域并保留结果的问题

你已经通过RSelenium成功抓取维基百科表格,能单独提取单个单元格的数值,但尝试批量处理表格指定区域(第2-3行、第5-8列)时失败。问题出在你错误地将单个提取结果(字符串)作为参数传给apply,而apply需要的是可调用的函数。

错误原因

你的代码中:

celsius <- str_extract(df[4,2], "\\d+([.,]\\d+)?+(?<!\\()")
apply(df[c(2:3),c(5:8)], c(1,2), celsius)

celsius是单个单元格的提取结果(字符串值),不是函数,apply无法执行这个值,因此报错。

解决方案

把正则提取逻辑包装成函数,再批量处理指定区域并将结果写回原数据框,以下是两种可行方法:

方法1:基础R apply 实现

library(stringr)

# 定义通用提取函数
extract_numeric <- function(cell_value) {
  str_extract(cell_value, "\\d+([.,]\\d+)?+(?<!\\()")
}

# 先确保目标区域是字符类型(避免因子类型报错)
df[2:3, 5:8] <- lapply(df[2:3, 5:8], as.character)
# 批量处理指定区域并替换原数据框对应位置
df[2:3, 5:8] <- apply(df[2:3, 5:8], c(1, 2), extract_numeric)

方法2:tidyverse 更直观实现

如果你习惯用dplyr,可以用across精准控制行和列:

library(dplyr)
library(stringr)

# 复用上面的extract_numeric函数
df <- df %>%
  mutate(
    across(
      .cols = 5:8,  # 指定要处理的列
      .fns = ~ ifelse(row_number() %in% 2:3, extract_numeric(.), .)  # 仅处理第2-3行
    )
  )

注意事项

  • 如果目标单元格是因子类型,必须先转换为字符类型再提取,否则正则无法匹配。
  • 若提取后需要数值类型,可在函数中加入as.numeric(),比如:as.numeric(str_extract(...))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 01:00:33