R语言:拆分多分隔符字符串,提取指定字符至新列
提取SampleID指定内容的解决方案
针对你的需求,这里提供几种可行的R语言实现方法,包括你询问的separate_wider_regex,以及更简洁的替代方案:
方法1:使用tidyr::separate_wider_regex
通过正则表达式匹配不同部分的结构,直接拆分出目标列:
library(tidyr) df <- data.frame(SampleID = c( "Akt.B.M_1867_1:100", "Akt.B.M_1869_1:100", "Akt.B.M_1871_1:100", "Akt.B.M_1878_1:100", "M.M.K_1259_1:100", "M.M.K_1262_1:100", "M.M.K_1264_1:100", "M.M.K_1272_1:100", "SKO.Shard_30_1:100", "SKO.Shard_32_1:100", "SKO.Shard_45_1:100", "Zh.San_618_1:100", "Zh.San_624_1:100", "Zh.San_629_1:100" )) df_extracted <- df %>% separate_wider_regex( SampleID, patterns = c( prefix = "[^.]+", # 匹配第一个句号前的所有非句号字符 ".*?_", # 非贪婪匹配到第一个下划线(跳过中间无关内容) mid_num = "[^_]+", # 匹配两个下划线之间的非下划线字符 ".*" # 匹配剩余所有内容(直接忽略) ) ) print(df_extracted)
方法2:用stringr::str_extract直接提取(更简洁)
无需拆分整个字符串,直接定位目标内容提取:
library(stringr) library(dplyr) df_extracted <- df %>% mutate( # 提取开头到第一个句号前的内容 prefix = str_extract(SampleID, "^[^.]+"), # 提取两个下划线之间的内容(利用正则预查定位) mid_num = str_extract(SampleID, "(?<=_)[^_]+(?=_)") ) print(df_extracted)
方法3:使用tidyr::extract
通过正则分组一次性提取目标列,语法更紧凑:
library(tidyr) df_extracted <- df %>% extract( SampleID, into = c("prefix", "mid_num"), # 正则分组:第一组是第一个句号前内容,第二组是两个下划线之间内容 regex = "^([^.]+).*?_([^_]+)_.*", remove = FALSE # 保留原SampleID列,不需要可设为TRUE ) print(df_extracted)
以上三种方法都能得到相同结果,你可以根据自己的代码习惯选择。
内容的提问来源于stack exchange,提问作者bhopalstiffs
相关产品推荐
相关产品推荐

