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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 13:25:59