如何基于子串匹配筛选字符向量?匹配第四个'-'前的条码子串
问题描述
需要创建ori.same.maf.barcodes变量,存储ori.maf.barcode中满足以下条件的条目:其Tumor_Sample_Barcode字段第四个“-”之前的子串与sub.same.barcodes中的字符串匹配。
变量生成背景
ori.maf.barcode来自maf@clinical.datasub.maf.barcode是对ori.maf.barcode$Tumor_Sample_Barcode截取第四个“-”前子串得到的,代码如下:
sub.maf.barcode <- gsub("^([^-]*-[^-]*-[^-]*-[^-]*).*", "\\1", ori.maf.barcode$Tumor_Sample_Barcode) # 保留前四段内容
sub.same.barcodes是sub.maf.barcode与sub.met.barcode的交集,代码如下:
sub.same.barcodes <- intersect(sub.maf.barcode, sub.met.barcode)
尝试代码及问题
尝试用以下代码将sub.same.barcodes匹配回ori.maf.barcode:
ori.same.maf.barcodes <- ori.maf.barcode %in% sub.same.barcodes
但返回的是FALSE,而非预期的字符向量。问题根源是ori.maf.barcode是data.table/data.frame对象,而sub.same.barcodes是字符向量,直接用%in%会尝试将整个数据框与字符向量匹配,逻辑完全错误。
相关数据
dput(ori.maf.barcode[1:20])输出:
structure(list(Tumor_Sample_Barcode = c("TCGA-2K-A9WE-01A-11D-A382-10", "TCGA-2Z-A9J1-01A-11D-A382-10", "TCGA-2Z-A9J2-01A-11D-A382-10", "TCGA-2Z-A9J3-01A-12D-A382-10", "TCGA-2Z-A9J5-01A-21D-A382-10", "TCGA-2Z-A9J6-01A-11D-A382-10", "TCGA-2Z-A9J7-01A-11D-A382-10", "TCGA-2Z-A9J8-01A-11D-A42J-10", "TCGA-2Z-A9JD-01A-11D-A42J-10", "TCGA-2Z-A9JG-01A-11D-A42J-10", "TCGA-2Z-A9JI-01A-11D-A42J-10", "TCGA-2Z-A9JJ-01A-11D-A42J-10", "TCGA-2Z-A9JK-01A-11D-A42J-10", "TCGA-2Z-A9JM-01A-12D-A42J-10", "TCGA-2Z-A9JN-01A-21D-A42J-10", "TCGA-2Z-A9JO-01A-11D-A42J-10", "TCGA-2Z-A9JQ-01A-11D-A42J-10", "TCGA-2Z-A9JR-01A-12D-A42J-10", "TCGA-2Z-A9JS-01A-21D-A42J-10", "TCGA-3Z-A93Z-01A-11D-A36X-10")), class = c("data.table", "data.frame" ), row.names = c(NA, -20L), .internal.selfref = <pointer: 0x0000025e377005d0>)
dput(sub.met.barcode[1:20])输出:
c("TCGA-BQ-7058-01A", "TCGA-DZ-6131-01A", "TCGA-UZ-A9PZ-01A", "TCGA-2Z-A9JQ-01A", "TCGA-BQ-5887-11A", "TCGA-G7-7502-01A", "TCGA-B1-A47M-11A", "TCGA-SX-A7SO-01A", "TCGA-HE-A5NJ-01A", "TCGA-MH-A856-01A", "TCGA-A4-8312-01A", "TCGA-BQ-5892-01A", "TCGA-A4-7732-11A", "TCGA-5P-A9K9-01A", "TCGA-UZ-A9PX-01A", "TCGA-BQ-7061-01A", "TCGA-BQ-5876-01A", "TCGA-DZ-6134-01A", "TCGA-BQ-5884-01A", "TCGA-BQ-5889-11A")
解决方案
需要先对ori.maf.barcode中的Tumor_Sample_Barcode字段截取前四段子串,再判断该子串是否属于sub.same.barcodes,最后筛选原数据中的匹配条目。
方法一:分步处理(便于调试)
# 为原数据添加截取后的子串列 ori.maf.barcode$sub_barcode <- gsub("^([^-]*-[^-]*-[^-]*-[^-]*).*", "\\1", ori.maf.barcode$Tumor_Sample_Barcode) # 筛选子串匹配的条目 ori.same.maf.barcodes <- ori.maf.barcode[ori.maf.barcode$sub_barcode %in% sub.same.barcodes, ]
方法二:链式处理(无需额外列)
利用data.table的语法直接在筛选条件中处理字符串:
ori.same.maf.barcodes <- ori.maf.barcode[ gsub("^([^-]*-[^-]*-[^-]*-[^-]*).*", "\\1", Tumor_Sample_Barcode) %in% sub.same.barcodes, ]
结果验证
从提供的示例数据来看,sub.met.barcode包含TCGA-2Z-A9JQ-01A,对应ori.maf.barcode中的第17条数据(TCGA-2Z-A9JQ-01A-11D-A42J-10),所以最终ori.same.maf.barcodes会仅包含这条匹配的条目。
内容的提问来源于stack exchange,提问作者melolilili
相关产品推荐
相关产品推荐

