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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:38:16