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

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开头的探针ID
  • genes.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")

错误原因

  1. 长度不匹配:原代码中bm.meth$hgnc_symbol %in% meth.genes会返回所有匹配到的基因对应的Ensembl ID,但该结果的长度和meth的行数不一致(比如一个基因对应多个Ensembl ID,或重复匹配),导致设置行名时触发长度错误。
  2. 循环逻辑错误:尝试的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:13:12