R语言解决甲基化数据Ensembl ID行名重复及长度不匹配问题
甲基化数据行名映射问题及解决方法
问题背景
处理甲基化数据时,meth.genes是与meth数据框行名一一对应的字符向量,存在**一个基因对应多个探针(meth行名)**的一对多映射关系。需将基因名匹配到Ensembl ID后,映射回meth的行名,且为重复的ID添加递增后缀(如.1、.2),但执行现有代码时触发以下错误:
Error in `.rowNamesDF<-`(x, value = value) : invalid 'row.names' length
原代码
meth.genes <- genes.mapped$nearestGeneSymbol bm.meth <- getBM(attributes = c("ensembl_gene_id", "hgnc_symbol"), filters = "hgnc_symbol", mart = ensembl, values=meth.genes) idx.meth <- meth.genes %>% match(table = bm.meth$hgnc_symbol) meth.ensembl <- bm.meth$ensembl_gene_id[bm.meth$hgnc_symbol %in% meth.genes] rownames(meth) <- meth.ensembl
尝试的错误代码
for i in length(duplicated(meth.ensembl)) { paste0(rownames(meth), ".", i) }
数据示例
meth行名前3500条为cg开头的探针IDgenes.mapped前3行数据:
structure(list(queryHits = 1:3, subjectHits = c(17721L, 11282L, 20626L), distance = c(237L, 11879L, 0L), nearestGeneSymbol = c("RBL2", "BARHL2", "VDAC3")), row.names = c("cg00000029", "cg00000165", "cg00000236"), class = "data.frame")
meth.genes前3条:c("RBL2", "BARHL2", "BARHL2")- 预期输出行名前3条:
c("ENSG00000175899", "ENSG00000184389.1", "ENSG00000184389.2")
错误原因
- 长度不匹配:原代码中
bm.meth$hgnc_symbol %in% meth.genes会返回所有匹配到的基因对应的Ensembl ID,但该结果的长度和meth的行数不一致(比如一个基因对应多个Ensembl ID,或重复匹配),导致设置行名时触发长度错误。 - 循环逻辑错误:尝试的for循环语法错误(缺少括号),且
length(duplicated(meth.ensembl))仅返回1,无法遍历所有重复项,也没有正确生成递增后缀。
解决方案
以下代码先保证一对一匹配,再为重复ID添加递增后缀:
# 1. 一对一匹配每个探针对应的Ensembl ID,保证长度与meth行数一致 meth.ensembl <- bm.meth$ensembl_gene_id[match(meth.genes, bm.meth$hgnc_symbol)] # 2. 为重复的Ensembl ID生成递增后缀 suffix <- ave(meth.ensembl, meth.ensembl, FUN = function(x) { if (length(x) > 1) paste0(".", seq_along(x)) else "" }) # 合并ID与后缀,得到唯一行名 meth.ensembl_unique <- paste0(meth.ensembl, suffix) # 3. 设置meth的行名 rownames(meth) <- meth.ensembl_unique
代码说明
match(meth.genes, bm.meth$hgnc_symbol):返回每个meth.genes元素在bm.meth$hgnc_symbol中的位置,确保meth.ensembl的长度和meth的行数完全一致,解决长度不匹配问题。ave()函数:按Ensembl ID分组,仅当组内元素数量大于1时,为每个元素添加.1、.2这类递增后缀,保证行名唯一。
验证
用给出的前3条meth.genes测试,处理后生成的行名与预期完全一致:c("ENSG00000175899", "ENSG00000184389.1", "ENSG00000184389.2")
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

