如何在R语言中提取子串"sst"前的对应数字?
解决方案
可以通过正则表达式精准匹配"SST/sst"前的数字,结合R语言工具实现需求,以下是两种可行方法:
方法1:使用stringr包(语法简洁,推荐)
library(stringr) # 匹配SST/sst前的数字片段,无匹配则返回NA df1$num_sst <- str_extract(df1$bloods, "(\\d+)\\s*SST", ignore.case = TRUE) # 提取片段中的纯数字部分 df1$num_sst <- str_extract(df1$num_sst, "\\d+") # 将NA替换为0并转为数值型 df1$num_sst <- as.integer(replace(df1$num_sst, is.na(df1$num_sst), 0))
方法2:基础R实现(无需额外安装包)
# 用正则表达式匹配目标内容,提取捕获组 matches <- regexec("(\\d+)\\s*SST", df1$bloods, ignore.case = TRUE) # 提取匹配到的数字,无匹配则返回NA num_sst <- sapply(regmatches(df1$bloods, matches), function(x) if(length(x)>1) x[2] else NA) # 替换NA为0并转为数值型 df1$num_sst <- as.integer(replace(num_sst, is.na(num_sst), 0))
最终输出结果
运行代码后,df1会新增num_sst列,结果如下:
> df1 subject_id bloods num_sst 1 191-5467 2 SST, 1 EDTA 2 2 191-6784 1 EDTA 2 sst 2 3 191-3457 1SST, 2 EDTA 1 4 191-0987 2 EDTA, 1SST collected 1 5 191-1245 2SST, 1EDTA 2 6 191-1945 1 EDTA 0
正则表达式说明
(\\d+):捕获一个或多个连续数字,作为我们需要提取的目标值\\s*:匹配0个或多个空格,兼容数字与SST之间有/无空格的情况ignore.case = TRUE:忽略大小写,同时匹配大写的SST和小写的sst
内容的提问来源于stack exchange,提问作者Thandi
相关产品推荐
相关产品推荐

