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

R语言:如何高效提取字符串末尾的1-2位数字?

高效提取DataFrame字符串末尾数字的简洁方案

你的场景是从Sensor列提取末尾(A/B/F之后)的1-2位数字到新列,原方法通过多次字符串截取和条件判断实现,不仅代码繁琐,处理大型数据集时效率也偏低。以下几种更简洁高效的实现方式:

方法1:使用stringr::str_extract(tidyverse生态)

利用正则表达式的正向预查直接定位目标数字,代码简洁且性能优异:

library(tidyverse)

df <- structure(list(row = 1:9, Sensor = c("Inclin_01_A1", "Inclin_01_A2", "Inclin_01_A10", "Inclin_01_A25", "Inclin_01_B1", "Inclin_01_B2", "Inclin_01_B36", "Temp_F1", "Temp_F14")), row.names = c(NA, -9L), class = "data.frame")

df_processed <- df %>%
  mutate(newcol = str_extract(Sensor, "(?<=[ABF])\\d+$"))

正则说明:

  • (?<=[ABF]):正向肯定预查,确保目标数字前是A/B/F中的任意一个
  • \\d+$:匹配字符串末尾的1个或多个数字(完美适配你场景中的1-2位数字)

方法2:使用base R的sub(无需额外包)

如果不想加载tidyverse,base R的字符串替换函数同样能高效完成提取:

df$newcol <- sub(".*[ABF](\\d+)$", "\\1", df$Sensor)

逻辑说明:

  • .*[ABF]:匹配到最后一个A/B/F之前的所有字符
  • (\\d+)$:捕获末尾的数字组
  • \\1:将整个字符串替换为捕获到的数字组,等价于提取目标内容

方法3:使用tidyr::extract(列拆分式提取)

如果需要更直观的列拆分操作,tidyr的extract函数可以一步完成:

df_processed <- df %>%
  extract(Sensor, into = "newcol", regex = ".*[ABF](\\d+)$", remove = FALSE)

参数说明:

  • remove = FALSE:保留原Sensor列,若不需要可设为TRUE

方案优势对比

相比你原有的str_sub+if_else组合:

  • 代码更简洁,无需嵌套复杂的条件判断
  • 底层为向量化字符串操作,处理大型数据集时效率提升明显
  • 正则逻辑更通用,若后续数字位数扩展(比如3位),无需修改代码即可适配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 19:07:23