非模式蓝细菌物种注释包构建

更新于2021.4.9
又写了一个script,用来一次性构建多个物种包的。
成功倒是成功了,就是可能效率比较低。
主要是用了for循环,然后用列表分别存储各自物种的数据的。
可能还会有更好的方法,以后再琢磨琢磨


R刚入门,最近在学习非模式物种注释包构建,记录一下。主要参考的教程如下:

相关版本信息:

版本号
R 4.0.3
Bioconductor 3.12
AnnotationForge 1.32.0
AnnotationDbi 1.52.0
ClusterProfiler 3.18.1
dplyr 1.0.3
stringr 1.4.0
data.table 1.14.0

ppps:我在安装clusterProfiler的时候,出现了安装失败的问题。
如果你也碰到了可以试试修改一下镜像哈~
Tools->Global Options->packages
或者直接用命令设置也可以~

options("repos" = c(CRAN="https://mirrors.tuna.tsinghua.edu.cn/CRAN/"))
##clusterProfiler&AnnotationForge
if (!requireNamespace("BiocManager", quietly = TRUE))
  install.packages("BiocManager")

BiocManager::install("clusterProfiler")
BiocManager::install("AnnotationForge")
##other packages you may don't have
if(! require("dplyr")) install.packages("dplyr")
if(! require("stringr")) install.packages("stringr")
if(! require("data.table")) install.packages("data.table")

方法一:AnnotationHub

https://bioconductor.org/packages/release/bioc/html/AnnotationHub.html
不过这个方法我没有去做,直接用下面的方法自己构建的。想了解的话可以康康上面参考的教程。

方法二:AnnotationForge

  1. 获取蛋白序列,eggnog-mapper人工构建注释。
    这一步我直接用的导师给我的数据,所以没做。可以康康上面参考的教程。
    为了方便看,我把教程的代码copy过来。
##下载你想要的序列,教程里的例子是芝麻Sesame
wget http://www.sesame-bioinfo.org/SesameFG/BLAST_search/G608_contig_2014-08-29.FgeneSH.pep.rar
# 解压后上传
# 前提是自己安装好eggnog-mapper并且下载好相应的数据库
emapper.py -m diamond \
           -i sesame.fa \
           -o diamond \
           --cpu 19
# 得到如下信息,然后进行处理,只保留表头query_name这一行的注释信息,去掉头尾的# 等信息
sed -i '/^# /d' diamond.emapper.annotations 
sed -i 's/#//' diamond.emapper.annotations 
  1. 加载包&读入文件
library(clusterProfiler)
library(dplyr)
library(stringr)
library(data.table)
options(stringsAsFactors = F)
##这个命令hin重要!!千万不要忘记设置!!
##这样设置,所有在数据框中的字符会被当做character来处理。

#设置工作路径
setwd("D:/xxxx")#记得修改
#读取文件
#这个UTEX2973是我挑出来的一个物种,记得修改!
data <- fread('UTEX2973.tab',data.table = T)
data[data == ""]<- #将空行替换成NA,方便后续去除

我的文件跟用eggnog-mapper得到的细节有些不太一样,截张图参考一下~我一共有20列。然后我挑了一个物种出来先试着构建一个物种包。


data
  1. 挑选Locus_tag&Gene
gene_info <- data %>% dplyr::select(GID = Locus_tag,GENENAME = Gene) %>% na.omit()
gene_info

4.Locus_tag&GO, 并得到对应关系

#Step4-1:挑出两列
gterms <- data %>% dplyr::select(GID = Locus_tag,GO_LIST = GO_LIST) %>% na.omit
#Step4-2::得到两者对应关系
#(一)用for循环,效率较低
##先构建一个空数据框GID=》Locus_tag,GO_LIST=》GO号,EVIDENCE =》默认IDA
gene2go <- data.frame(GID = character(),
                      GO = character(),
                      EVIDENCE = character())

##然后向其中填充:以GO号为标准,每一行只能有一个GO号,Locus_tag和EVIDENCE可以重复
for(row in 1:nrow(gterms)){
  gene_terms <- str_split(gterms[row,"GO_LIST"]," ",simplify = FALSE)[[1]]
  gene_id <- gterms[row,"GID"][[1]]
  tmp <- data_frame(GID = rep(gene_id,length(gene_terms)),
                    GO = gene_terms,
                    EVIDENCE = rep("IEA",length(gene_terms)))
  gene2go <- rbind(gene2go,tmp)
}
#(二)用sapply,效率较高
all_go_list = str_split(gterms$GO_LIST," ")
gene2go <- data.frame(GID = rep(gterms$GID,
                               times = sapply(all_go_list,length)),
                     GO = unlist(all_go_list),
                     EVIDENCE = "IEA")
gterms
gene2go
  1. 挑出Locus_tag&KEGG,得到pathway2name,ko2pathway
    这一步需要下载一个json文件


    json下载
#Step5-1,挑出Locus_tag&KEGG
gene2ko <- data %>% dplyr::select(GID = Locus_tag,KO = KEGG) %>% na.omit
#Step5-2,pathway2name,ko2pathway
if(!file.exists('kegg_info.RData')){
  # 需要下载这个json文件 (经常更新)
  # https://www.genome.jp/kegg-bin/get_htext?ko00001
  library(jsonlite)
  library(purrr)
  library(RCurl)
  
  update_kegg <- function(json = "ko00001.json",file = NULL) {
    pathway2name <- data.frame(Pathway = character(), Name = character())
    ko2pathway <- data.frame(Ko = character(), Pathway = character())
    
    kegg <- fromJSON(json)
    
    for (a in seq_along(kegg[["children"]][["children"]])) {
      A <- kegg[["children"]][["name"]][[a]]
      
      for (b in seq_along(kegg[["children"]][["children"]][[a]][["children"]])) {
        B <- kegg[["children"]][["children"]][[a]][["name"]][[b]] 
        
        for (c in seq_along(kegg[["children"]][["children"]][[a]][["children"]][[b]][["children"]])) {
          pathway_info <- kegg[["children"]][["children"]][[a]][["children"]][[b]][["name"]][[c]]
          
          pathway_id <- str_match(pathway_info, "ko[0-9]{5}")[1]
          pathway_name <- str_replace(pathway_info, " \\[PATH:ko[0-9]{5}\\]", "") %>% str_replace("[0-9]{5} ", "")
          pathway2name <- rbind(pathway2name, tibble(Pathway = pathway_id, Name = pathway_name))
          
          kos_info <- kegg[["children"]][["children"]][[a]][["children"]][[b]][["children"]][[c]][["name"]]
          
          kos <- str_match(kos_info, "K[0-9]*")[,1]
          
          ko2pathway <- rbind(ko2pathway, tibble(Ko = kos, Pathway = rep(pathway_id, length(kos))))
        }
      }
    }
    
    save(pathway2name, ko2pathway, file = file)
  }
  
  update_kegg(json = "ko00001.json",file="kegg_info.RData")
  
}

这一步出过好多问题,查资料查了好久。上面那个超级复杂的代码是参考刘小泽老师的,中途遇到过kegg_info.RData文件没生成出来的问题,修改了一下,然后就得到文件啦!

  1. 利用gene2ko与ko2pathway将基因与pathway对应起来


    gene2ko

    ko2pathway
load(file = "kegg_info.RData")
#运行数据框合并前需要做到两个数据框列名对应,将原来的gene2ko中ko修改一下
colnames(ko2pathway)=c("KO",'Pathway')
gene2ko$KO=str_replace(gene2ko$KO,"ko:"," ")
##因为要对应嘛,所以还需要将ko2pathway中的KO列中的K删掉
ko2pathway$KO <- str_replace(ko2pathway$KO, "K", "")

##上面这个处理不是完全一致的,仅仅只是针对我自己的数据。如果你们参考我的这个来做注释包构建的话,建议先观察自己的数据,视情况而定哈~

#合并
gene2pathway <- gene2ko %>% left_join(ko2pathway,by = "KO") %>% 
  dplyr::select(GID,Pathway) %>% na.omit()
gene2pathway

现在一个个的对应都建立起来啦,可以开始构建注释包啦~

  1. 构建注释包,AnnotationForge
library(AnnotationForge)
##tax_id可以去网站搜的哈
#https://www.ncbi.nlm.nih.gov/taxonomy/
tax_id="1350461"
genus="Synechococcus"
species="elongatus"

makeOrgPackage(gene_info=gene_info,
               go=gene2go,
               ko=gene2ko,
               maintainer='<xxxxxxxxx@qq.com>',##这里记住<>这俩括号一定要记得加上哈!下面那个也是的!
               author='<xxxxxxxxx@qq.com>',
               pathway=gene2pathway,
               version="0.0.1",
               outputDir = ".",
               tax_id=tax_id,
               genus=genus,
               species=species,
               goTable="go")

至此,注释包就构建完成啦!!后面的GO、KEGG富集分析啥的我暂时先不写了,现在要继续去完成导师任务了qaq
我用这个代码跑下来是没出啥问题的,如果有问题可以一起讨论哈~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容