如何将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
相关产品推荐
相关产品推荐

