如何基于ensembl ID列表筛选R数据框行,仅保留蛋白编码基因并解决代码问题
问题原因和解决方案
1. 第一段代码筛选完全不生效的原因
- 逻辑判断取反错误:代码中加了
!运算符,代表筛选不在ProtCod列表中的行,和你要保留蛋白编码基因的需求完全相反。 - 匹配对象类型错误:
%in%右侧需要传入字符向量才能做匹配,但你传入的ProtCod是单列的数据框对象,无法和行名正常匹配,最终所有匹配结果都是FALSE,取反后全为TRUE,因此所有行都被保留,维度和原数据完全一致。 - 额外注意:从你给出的示例来看,ENSEMBL ID是
BDC的第一列而非行名,行名如果是默认的数字索引,也会导致匹配完全失效。
2. 第二段代码行数正确但全为NA的原因
你通过unlist(ProtCod)得到了蛋白编码ID的向量,但直接将该向量作为行索引传入BDC[ , ]时,R会默认把这些ID当作BDC的行名去匹配:
如果你的BDC行名是默认的1、2、3…数字索引,而非ENSEMBL ID,自然找不到对应的行,就会返回行数匹配但值全为NA的结果。
正确实现代码
根据你的示例数据,ENSEMBL ID是BDC的第一列,使用以下代码即可完成筛选:
# 先提取蛋白编码ID为字符向量 prot_cod_ids <- ProtCod$ENSEMBL_Protein_Coding # 筛选BDC中ENSEMBL ID属于蛋白编码列表的行 BDCProtCod <- BDC[BDC$ENSEMBL %in% prot_cod_ids, ] # 验证结果 dim(BDCProtCod) head(BDCProtCod)
如果确认ENSEMBL ID是BDC的行名,改用以下代码:
prot_cod_ids <- as.character(ProtCod$ENSEMBL_Protein_Coding) BDCProtCod <- BDC[rownames(BDC) %in% prot_cod_ids, ]
内容的提问来源于stack exchange,提问作者Dswede43
相关产品推荐
相关产品推荐

