总代码
strsplit('ENSG000000003.13','[.]')[[1]][1] #这一步只是举一行例子,把.?去掉
str_split(a$V1,'[.]', simplify=T) #用R包取ensenmble.id,simplify=T保证返回矩阵
#对应gene, gene_id, ensemble_id
先把对应的注释文件读到R中
strsplit('ENSG000000003.13','.')
[[1]]
[1] "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
strsplit('ENSG000000003.13','[.]')
[[1]]
[1] "ENSG000000003" "13"
#.不加[]代表任意字符,会把所有的东西都分隔开,所以要加[]表示只在[.]分割
strsplit('ENSG000000003.13','[.]')[[1]]
[1] "ENSG000000003" "13" #这是第一个元素,是一个向量
#class(strsplit('ENSG000000003.13','[.]')[[1]])
#[1] "character"
#在向量里再取第一个元素,分割之后第一次取是把分割的都取出来,在取[1]才是想要的第一个
strsplit('ENSG000000003.13','[.]')[[1]][1]
[1] "ENSG000000003"
ENSG000000003.13是一个基因的符号,后面的.13代表更新,没有用,所以在转化的事后删掉。[具体有没有用可以打开基因id转换列表查一下]
基因id转换应该是一个列表,所以应该做一个循环,取出每一行进行转化
有专门的R包
str_split
str_split(a$V1,'[.]')
class(str_split(a$V1,'[.]'))
"charicater"
str_split(a$V1,'[.]', simplify=T)
class(str_split(a$V1,'[.]'), simplify=T)
"matrix"
str_split(a$V1,'[.]', simplify=T)[,1]
#只有转化成matrix才能取出基因转换列表的第一列
#取基因转换列表的第一列
用代码解决gene, ensembl_id, gene_id
类似于vlookup
b=merge(a, g2e, by="ensemble_id", all.x=T)
#all.x=T a里面的东西都保留,不因找不到对应的就把a里面的元素丢掉
#示例中a是自己DEGs的ensemble_id,g2e是ensemble_id还有gene_id,g2s是gene_id和gene
d=merge(b,g2s,by="gene_id", all.x=T)
特殊情况:有些基因可能关联不到
得到的对应基因需要调整为DEGs的顺序,上面的函数是用共有的那一列来排序
d=d[order(d$V1),]#按照最新合并了所有列的表格d中V1排序
特殊情况:新的到的表格d比a多了行,是因为有些基因出现几次
![微信图片_20220317125258.png](https://upload-images.jianshu.io/upload_images/27773552-55e4f2f867cf10bb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
table(d$ensemble_id)#了解每一个出现的频率
table(table(d$ensemble_id)>1)#挑选大于1次
table(d$ensemble_id)[table(d$ensemble_id)>1]
去重
d=d[!duplicated(d$V1),]
d=d[match(a$V1,d$V1),]#把a中V1的顺序放到d中V1的顺序,就是match函数
write.csv(d,"geneID2symbol.csv")