在R语言中保留样本类型列的Tumor/Normal并过滤行的方法
问题描述
现有如下R数据框:
structure(list(submitter_id = c("TCGA-B6-A0RH-01A-21R-A115-07", "TCGA-BH-A1FU-11A-23R-A14D-07", "TCGA-BH-A1FU-01A-11R-A14D-07", "TCGA-AR-A0TX-01A-11R-A084-07", "TCGA-A1-A0SE-01A-11R-A084-07", "TCGA-BH-A1FC-11A-32R-A13Q-07", "TCGA-OL-A5D6-01A-21R-A27Q-07", "TCGA-E2-A1IK-01A-11R-A144-07", "TCGA-AC-A2FM-11B-32R-A19W-07", "TCGA-AN-A0FT-01A-11R-A034-07"), sample_type = c("Primary Tumor", "Solid Tissue Normal", "Primary Tumor", "Primary Tumor", "Metastatic", "Solid Tissue Normal", "Primary Tumor", "Primary Tumor", "Solid Tissue Normal", "Primary Tumor")), row.names = c(NA, 10L), class = "data.frame")
需要完成两个操作:
- 将
sample_type列中的值仅保留Tumor或Normal,删除其余内容; - 筛选出仅包含
Tumor或Normal的行(移除像Metastatic这类不包含目标关键词的行)。
期望输出:
structure(list(submitter_id = c("TCGA-B6-A0RH-01A-21R-A115-07", "TCGA-BH-A1FU-11A-23R-A14D-07", "TCGA-BH-A1FU-01A-11R-A14D-07", "TCGA-AR-A0TX-01A-11R-A084-07", "TCGA-BH-A1FC-11A-32R-A13Q-07", "TCGA-OL-A5D6-01A-21R-A27Q-07", "TCGA-E2-A1IK-01A-11R-A144-07", "TCGA-AC-A2FM-11B-32R-A19W-07", "TCGA-AN-A0FT-01A-11R-A034-07" ), sample_type = c("Tumor", "Normal", "Tumor", "Tumor", "Normal", "Tumor", "Tumor", "Normal", "Tumor")), row.names = c(NA, 9L), class = "data.frame")
之前尝试过sub、gsub和substr,但因字符长度不固定未成功。
解决方案
方法一:Base R 实现
利用正则匹配提取目标关键词,再筛选有效行:
# 加载数据 df <- structure(list(submitter_id = c("TCGA-B6-A0RH-01A-21R-A115-07", "TCGA-BH-A1FU-11A-23R-A14D-07", "TCGA-BH-A1FU-01A-11R-A14D-07", "TCGA-AR-A0TX-01A-11R-A084-07", "TCGA-A1-A0SE-01A-11R-A084-07", "TCGA-BH-A1FC-11A-32R-A13Q-07", "TCGA-OL-A5D6-01A-21R-A27Q-07", "TCGA-E2-A1IK-01A-11R-A144-07", "TCGA-AC-A2FM-11B-32R-A19W-07", "TCGA-AN-A0FT-01A-11R-A034-07"), sample_type = c("Primary Tumor", "Solid Tissue Normal", "Primary Tumor", "Primary Tumor", "Metastatic", "Solid Tissue Normal", "Primary Tumor", "Primary Tumor", "Solid Tissue Normal", "Primary Tumor")), row.names = c(NA, 10L), class = "data.frame") # 提取Tumor或Normal,无匹配项会被替换为空字符串 df$sample_type <- gsub(".*(Tumor|Normal).*", "\\1", df$sample_type) # 筛选掉空值行,只保留Tumor/Normal df_clean <- df[df$sample_type %in% c("Tumor", "Normal"), ] # 查看结果 df_clean
正则.*(Tumor|Normal).*会匹配任意字符开头、中间包含目标关键词、任意字符结尾的字符串,\\1提取括号内匹配到的关键词,之后过滤掉未匹配成功的行。
方法二:tidyverse 实现
如果习惯用tidy工具链,代码逻辑更直观:
library(dplyr) library(stringr) df_clean <- df %>% # 直接提取字符串中的Tumor或Normal,无匹配返回NA mutate(sample_type = str_extract(sample_type, "Tumor|Normal")) %>% # 过滤掉NA行 filter(!is.na(sample_type)) # 查看结果 df_clean
str_extract专门用于提取匹配的子串,配合filter快速移除无效行。
内容的提问来源于stack exchange,提问作者Sumit Kumar
相关产品推荐
相关产品推荐

