以梦为代码 2024-01-20 21:07 采纳率: 0%
浏览 54
已结题

[R语言]KEGG富集分析绘图问题

[学习]KEGG富集分析绘图问题
初学R语言,遇到了一些问题,请指点迷津,研究了好久,仍无头绪.
代码如下,为什么会出现无法绘制图片的情况?谢谢指点

## Gene functional enrichment analysis
## R版本为4.32,RStudio为3.18,clusterprofiler已更新至最新4.11版本
##数据集采用GSE41804,可见图片,已处理完成见图片部分
数据分别依次对应:
ID    Gene    logFC    AveExpr    t    P.Value    adj.P.Val  B  Compare
![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/ef636b24c72846348615d948c00905e1.jpeg "#left")

# packages
library(enrichplot)
library(org.Hs.eg.db)
library(clusterProfiler)
library(openxlsx)
library(KEGG.db) #由于kegg在线获取不稳定,已下载kegg.db,采用本地化分析节省时间
#setwd("/Users/user/Desktop/R")
# Load database
database <- org.Hs.egSYMBOL2EG
database <- as.list(database)


# Conversion of gene IDs
# Show entrez gene IDs
diff = read.xlsx("Table1.DEG.xlsx",sheet = 1) #差异基因没有出现NA情况
nrow(diff)

gene.list = diff$Gene
gene.list.enrich <- database[names(database) %in% gene.list]

# GO and KEGG enrichment
edo.kegg <- enrichKEGG(as.character(unlist(gene.list.enrich)), organism = "hsa",
                       pAdjustMethod = 'BH', keyType="KEGG",
                       pvalueCutoff = 1, qvalueCutoff = 1,use_internal_data = TRUE)



# gene enriched gene name
id2gene <- function(id.list){
  tmp = bitr(strsplit(id.list,"/")[[1]],fromType = "ENTREZID",toType = "SYMBOL",OrgDb = "org.Hs.eg.db")
  return(paste(tmp$SYMBOL,collapse = "/"))
}



## KEGG out
edo.kegg.out = as.data.frame(edo.kegg)[1:100,] 
head(edo.kegg.out)
tmp = unlist(as.data.frame(sapply(edo.kegg.out$geneID, id2gene))[1])
colnames(tmp) = NULL
edo.kegg.out$geneName = tmp
write.xlsx(edo.kegg.out,"Table2.KEGG.xlsx") 

#该数据输出查看后,发现category和subcategory存在空值,尝试用na.omit函数删除edo.kegg中产生的空值
#到tmp部分就会出现报错:Error:replacement has 99 rows, data has 100,如果不删除,
#在下面画图阶段就会出现这个错误:
#Error in `$<-.data.frame`(`*tmp*`, "Ratio", value = numeric(0)) : 
#replacement has 0 rows, data has 10  不是很清楚如何处理该问题
#In addition: Warning message:画图警告这里可以忽略
#In DrawGOBubblePlot(data, "KEGG", 10, "blue") : NAs introduced by coercion



#Draw GO_KEGG BUBBLE PIC
library(Hmisc)
library(ggplot2)
library(stringr)
library(cowplot)

DrawGOBubblePlot <- function(dat, category = "KEGG", top.number = 15, col="blue"){
  # Draw bubble plot using DAVID function enrichment results
  
  category = toupper(category)
  
  if (category == "KEGG"){
    main.title = "cleanKEGG"
  } else {
    return(p)
  }
  
  dat1 = dat[c(1:top.number),c(2,3,4,5,9)]
  dat1[,2] = str_remove(dat1[,2],"/.*")
  dat1[,3] = str_remove(dat1[,3],"/.*")
  dat1$Ratio = as.numeric(dat1$GeneRatio) / as.numeric(dat1$BgRatio)
  
  
  dat1$Description = capitalize(dat1$Description)
  dat1$Description = factor(dat1$Description,levels=dat1$Description[length(dat1$Description):1])
  dat1$pvalue = -log10(dat1$pvalue)
  
  p = ggplot(dat1,aes(Ratio,Description)) +
    geom_point(aes(size=Count,colour=pvalue)) +
    scale_colour_gradient(low=col,high="red") + 
    labs(colour=expression(-log[10]("P Value")),size="Gene counts",  
         x="Gene Ratio",y="",title=main.title) +
    theme_bw() +
    scale_x_continuous(limits = c(0,max(dat1$Ratio) * 1.2)) +
    scale_y_discrete(labels = function(x) str_wrap(x, width = 50))
  
  
}


#KEGG
data = read.xlsx("Table2.KEGG.xlsx")
head(data)
p = DrawGOBubblePlot(data,"KEGG",10,"blue")
p



img

  • 写回答

16条回答 默认 最新

  • GISer Liu 2024-01-20 21:12
    关注
    获得0.75元问题酬金

    该回答引用自GPT-4,由博主GIS_Liu编写:

    从您的描述来看,您在使用R语言进行KEGG富集分析时遇到了两个主要问题:

    1. 在构建绘图数据过程中,出现了“replacement has 99 rows, data has 100”的错误。
    2. 在绘图时出现了“replacement has 0 rows, data has 10”的错误,并伴随一个警告“NAs introduced by coercion”。

    针对这两个问题,下面是我的分析和解决方案:

    第一个问题分析:

    这个错误通常是因为你试图将一个含有99行的对象赋值给一个含有100行的对象。在R语言中,这是不允许的,因为赋值的两边必须完全匹配。

    解决方案:
    检查tmpedo.kegg.out两个数据框的维度,确保在你尝试合并或替换列时,它们的行数是相同的。如果你需要删除空值,确保在进行这一操作后,数据的行数仍然保持一致。

    # 首先确认两个数据框的行数
    nrow(tmp)
    nrow(edo.kegg.out)
    
    # 如果行数不一致,需要找出缺失的行并进行处理
    # 比如通过删除包含空值的行来确保一致性
    # 假设tmp数据框缺少一行,可以尝试以下方法
    tmp <- tmp[1:100, , drop = FALSE]  # 使tmp的行数与edo.kegg.out相同
    
    # 或者如果是因为删除NA导致的问题,可以尝试不用na.omit,而是手动过滤NA
    edo.kegg.out <- edo.kegg.out[!is.na(edo.kegg.out$geneName), ]
    

    第二个问题分析:

    这个错误表明在尝试创建新列“Ratio”时,由于某些原因没有任何行被替换。这通常是因为试图在一个空的数据框上进行操作,或者是因为进行了错误的数据类型转换导致所有值都变成了NA。

    解决方案:
    确保geneRatioBgRatio列在进行操作之前不包含NA值,并且它们的数据类型允许进行除法操作。如果这些列包含字符型数据,那么你需要先将它们转换为数值型数据。

    # 转换数据类型之前先检查是否存在NA值
    any(is.na(dat1$GeneRatio))
    any(is.na(dat1$BgRatio))
    
    # 确保将字符型数据转换为数值型数据
    dat1$Ratio <- as.numeric(as.character(dat1$GeneRatio)) / as.numeric(as.character(dat1$BgRatio))
    
    # 如果转换过程中产生了NA值,需要检查原始数据
    

    注意: 在进行数据类型转换时,如果原始数据中包含不能转换为数值的字符,例如“1/2”,那么转换结果会是NA。需要检查这些原始数据并进行清洗。

    以上是对您问题的分析和解决方案,希望能够帮助到您。如果在实施过程中还有其他问题,建议您检查数据和代码,或者提供更详细的错误信息以便进一步分析。

    如果该回答解决了您的问题,请采纳!如果没有,请详述问题所在!

    评论

报告相同问题?

问题事件

  • 系统已结题 1月28日
  • 赞助了问题酬金15元 1月20日
  • 创建了问题 1月20日