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

如何在R语言中使用正则表达式处理样本条码?

处理TCGA样本条码:保留前4个分隔子串并截断第4个的最后一位

需求说明

移除样本条码中的冗余内容,保留前4个以短横线分隔的子串,同时去掉第4个子串的最后一个字符。

原代码问题

你当前的正则表达式^([^-]*-[^-]*-[^-]*-[^-]*).{1}$无法满足需求:

  • 它仅匹配字符串末尾的1个字符并移除,但输入条码的冗余内容是第4个分隔子串之后的所有部分,且第4个子串本身还有额外字符(比如01A里的A)
  • 原正则的[^-]*会匹配完整的第4个子串(比如01A),没有截断最后一位的逻辑

解决方案

这里提供两种可靠的实现方式:

方法1:改进正则表达式

使用更精准的正则来捕获目标内容,忽略后续所有冗余部分:

sub.maf.barcode <- gsub("^([^-]*-[^-]*-[^-]*-[^-])(?:.*)$", "\\1", ori.maf.barcode$Tumor_Sample_Barcode)
  • 正则解析:
    • ^([^-]*-[^-]*-[^-]*-[^-]):捕获前3个完整子串,加上第4个子串的前n-1个字符([^-]匹配除短横线外的单个字符,对应第4个子串去掉最后一位)
    • (?:.*)$:非捕获组,匹配从第4个子串剩余部分到字符串结尾的所有内容
    • 替换为\\1,只保留捕获到的目标内容

方法2:分割重组(更直观易读)

如果觉得正则不好维护,可以用strsplit分割后再拼接:

# 分割每个条码为子串列表
barcode_parts <- strsplit(ori.maf.barcode$Tumor_Sample_Barcode, "-")
# 处理每个条码:取前4个部分,截断第4个的最后一位,再拼接
sub.maf.barcode <- sapply(barcode_parts, function(x) {
  x[4] <- substr(x[4], 1, nchar(x[4])-1)
  paste(x[1:4], collapse = "-")
})

测试验证

输入示例:

> ori.maf.barcode$Tumor_Sample_Barcode[1:5]
[1] "TCGA-2K-A9WE-01A-11D-A382-10" "TCGA-2Z-A9J1-01A-11D-A382-10"
[3] "TCGA-2Z-A9J2-01A-11D-A382-10" "TCGA-2Z-A9J3-01A-12D-A382-10"
[5] "TCGA-2Z-A9J5-01A-21D-A382-10"

使用上述任一方法后,输出结果:

> sub.maf.barcode[1:5]
[1] "TCGA-2K-A9WE-01" "TCGA-2Z-A9J1-01"
[3] "TCGA-2Z-A9J2-01" "TCGA-2Z-A9J3-01"
[5] "TCGA-2Z-A9J5-01"

内容的提问来源于stack exchange,提问作者melolilili

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:20:30