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

