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

如何用R的str_sub函数正确提取编码变量末尾1-2位数字?

提取字符串末尾数字编号的解决方案

问题背景

需要从编码变量v1(包含字符串"D018BG1"至"D018BG12",对应编号1到12)中提取末尾的1位或2位数字。使用str_sub时遇到问题:

  • 提取最后1位,两位数字的编号会丢失十位
  • 提取最后2位,单数字编号会带出前面的字母

问题复现代码:

v1<-c("D018BG1","D018BG2","D018BG3","D018BG4","D018BG5","D018BG6","D018BG7","D018BG8","D018BG9",
      "D018BG10","D018BG11","D018BG12")
df<-data.frame(v1)

# 提取最后1位的问题
df %>% mutate(replicate=str_sub(v1,-1,-1))
# 提取最后2位的问题
df %>% mutate(replicate=str_sub(v1,-2,-1))

方法1:正则表达式提取(推荐)

使用stringr包的str_extract函数,匹配字符串末尾的所有数字,无需判断长度,通用性更强:

library(dplyr)
library(stringr)

df %>%
  mutate(replicate = str_extract(v1, "\\d+$"))

运行结果:

v1 replicate
1   D018BG1         1
2   D018BG2         2
3   D018BG3         3
4   D018BG4         4
5   D018BG5         5
6   D018BG6         6
7   D018BG7         7
8   D018BG8         8
9   D018BG9         9
10 D018BG10        10
11 D018BG11        11
12 D018BG12        12

正则说明:\\d+匹配1个或多个数字,$限定匹配字符串末尾,确保只提取最后一段数字。


方法2:移除固定前缀

如果编码的前缀D018BG是固定不变的,直接移除前缀即可获取数字:

df %>%
  mutate(replicate = str_remove(v1, "D018BG"))

这个方法简单高效,适合前缀固定的场景。


方法3:结合str_sub与长度判断

如果坚持使用str_sub,可以通过字符串长度判断提取位数:

df %>%
  mutate(replicate = ifelse(str_length(v1) == 7, str_sub(v1, -1, -1), str_sub(v1, -2, -1)))

说明:单数字编码长度为7,两位数字编码长度为8,通过ifelse分支处理不同情况。


内容的提问来源于stack exchange,提问作者Marta Román

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 09:35:58