今天在处理爬下来各个通路数据库的数据时,发现各个通路的gene并不是gene symbol,而是gene id,这种情况可以利用bitr函数进行转换。
> library(tidyverse)
> library(dplyr)# %>% 功能需要调用这个包
> library(clusterProfiler)#bitr()需要调用的包
> library(org.Mm.eg.db)#小鼠的数据,我这里用的demodata是小鼠.其他物种
#需要安装对应的数据
data <- read.csv("TaxID_10090_pathway_No_Duplicates.csv",
sep = ",",
row.names = 1,
header = T)#读取文件,没什么好说的
#首先我们看一下数据结构,发现geneids列的gene使用"|"分隔开的
> head(data[1,])#查看第一行数据
name category source taxname taxid geneids
PathBank:SMP0119368 Coagulation Protein PathBank Mus musculus (house mouse) 10090 2147|14061|14066|56316|69568
> data <- data %>% #选定需要的列,transmute()这个函数很有意思,可以多注意
+ transmute(
+ name,
+ category,
+ source,
+ taxname,
+ taxid,
+ geneids
+ )
> #到此,前期数据的整理就完成了
关于"|"分隔的处理,详见此处。 接着,我们定义一个function,方便后续代码的编写,很简单,就是bitr的基本使用
#定义一个注释函数ann,其作用是转化id
#=======================================================
ann <- function(a){
c <- bitr(a$geneids%>%str_split("\\|")%>% unlist,
fromType = "ENTREZID",
toType = "SYMBOL",
OrgDb = "org.Mm.eg.db",
drop = TRUE)
return(c)
}#注意,demo数据的geneid使用"|"分隔的.|是一个特殊符号,应该使用转义符"\\"
#======================================================
关于自定义函数 function() 的介绍,参考此处。 将第一次循环手动运行,防止后续循环中进行合并的时候报错。会有更好的办法,但是我水平有限。
#准备一个data frame,不然再循环中合并哪里会报错,相当把第一次循环
> #手动运行了,代码水平太差只能这样凑合了.
> a <- data[1,]
> c <- bitr(a$geneids%>%str_split("\\|")%>% unlist,
+ fromType = "ENTREZID",
+ toType = "SYMBOL",
+ OrgDb = "org.Mm.eg.db",
+ drop = TRUE)
'select()' returned 1:1 mapping between keys and columns
Warning message:
In bitr(a$geneids %>% str_split("\\|") %>% unlist, fromType = "ENTREZID", :
20% of input gene IDs are fail to map... #这里的意思是,有一部分的geneid和symbol没有匹配上,这是正常的。
#一个set里基因数很少,所以匹配失败的百分比很高也无所谓
> c <- paste0(c$SYMBOL,collapse = ",")
> a$GeneSymbol <- c
> a1 <- a
进入for() 循环
> system.time(#查看for循环运行了多久,可以删除,但是注意括号删除干净
+ for (i in 2: length(row.names(data))){#对每一行进行一次循环
+ a <- data[i,]
+ temp <- try(c <- ann(a),
+ silent=FALSE)
+ if('try-error' %in% class(temp))# 判断当前循环的try语句中的表达式是否运行正确
+ {
+ c <- paste0(row.names(a),"-NA")
+ a$GeneSymbol <- c
+ a1 <- rbind(a1,a)# 如果循环报错,就运行这里
+ }else{
+ c <- paste0(c$SYMBOL,collapse = ",")
+ a$GeneSymbol <- c
+ a1 <- rbind(a1,a)#如果没有报错就运行这里
+ }
+ p <- i/length(row.names(data))#查看运行进度
+ print(paste0(round(100*p, 2),"%"))#当通路特别多时候,运行时间很长
+ #查看任务进度有助于平复心情
+ }
+ )
'select()' returned 1:1 mapping between keys and columns#忽略这个消息
[1] "0.01%"#这里就是任务进度了。
> write.csv(a1,"TaxID_10090_pathway_No_Duplicates_Duplicate_idtrans.csv",)#然后写出就好
> head(a1[1,])#最后就是这个样式,多添加了一列genesymbol
name category source taxname taxid geneids GeneSymbol
PathBank:SMP0119368 Coagulation Protein PathBank Mus musculus (house mouse) 10090 2147|14061|14066|56316|69568 F2,F3,Ggcx,Vkorc1l1
>
完整的代码及demo数据可以访问github下载。