【分析目标】像下面这种GO分析,在Excel表格里面给出了一堆基因名称,我怎么快速把所有的基因跟它们的功能注释一一对应起来呢?
最终想要的结果类似下图:
最近收到朋友的求助,想要解决上面的问题,其实用R语言和excel都可以实现。
用R 实现
library(openxlsx)library(tidyverse)#读取GO注释的基因列表gl read.xlsx("基因lists.xlsx")
朋友给我列表时只给出了要拆分的列,所以我就暂时用行号加了一列GO。
#给出行号gl$GO c(1:nrow(gl))
#按分隔符“|”将genelist拆分成列表gl.sp strsplit(gl$Hits,"[|]")
#将genlist中的GO分别和拆分后的列表的每个元素合并gl.spc mapply(cbind, gl$GO, gl.sp)
#最后将列表gl.spc转换为数据框,按行合并,即可得到目标排列的数据gl.d do.call(rbind.data.frame, gl.spc)colnames(gl.d) c("GO","Hits")#把Hits复制一份给Gene.IDgl.d$Gene.ID gl.d$Hits
#读取Araport注释anno read.xlsx("Araport11_annotation.xlsx")
接下来就是要合并两个数据gl.d和anno。
#inner_join: 合并数据,仅保留匹配的记录# a是按ID来合并数据, b是按symbol来合并数据a inner_join(gl.d, anno, by=c("Gene.ID"="ID"))b inner_join(gl.d, anno, by=c("Hits"="symbol"))colnames(a)[colnames(a)=="Gene.ID"] "ID"a a[,c("GO","Hits","ID","locus_type","symbol","full_name", "Note","curator_summary","Alias","computational_description")]colnames(b)[colnames(b)=="Gene.ID"] "symbol"b b[,c("GO","Hits","ID","locus_type","symbol","full_name", "Note","curator_summary","Alias","computational_description")]#合并两部分gl.r rbind(a,b)#按之前的行号排序gl.r arrange(gl.r, as.numeric(GO))write.xlsx(gl.r, "基因lists_anno.xlsx")
用excel实现
选中所要拆分的列,然后利用“数据”中的“分列”功能:
分隔符自己输入“|”,然后点完成,就变成了如下图所示:
然后进行复制,新建一个sheet, 粘贴时进行转置:
然后再合并成一列(这一步如果GO注释的行数多的话,那么用excel进行剪切再粘贴就会很繁琐),如下图所示:
到这一步后,就需要用到基因注释的总表了,格式如下:
接下来再利用VLOOKUP函数之前还需要做一些小的调整,首先需要把Hits这一列都变成ID的格式, 如"AT0G00000"。
总结: 如果数据比较少的话,excel就能实现;如果数据多的话,还是用R方便。