问题:一个文件的pathway列和另外一个的pathway列匹配后,求它们上调基因的交集?
我刚听见这个需求的时候,心想:害。这多简单,excel就能做。结果我试了下,VOOKUP函数确实可以实现。但要手动很多东西,几十个pathway下来,你搞一下午都不一定搞得完。果然excel
不是生产力工具。
先看文件结构:
文件1
文件2
这里只截取了前几行。总的来说就是要根据Level2列求它们共有Up_gene/Down_gene (每个单元格中都包含很多基因,它们以逗号分隔)
方法一:excel
- VOOKUP根据Level2列,把文件2的Up_gene/Down_gene对应到文件1上,再手动把文件1的Up_gene/Down_gene复制到新的表格,以逗号分隔符隔开。然后转置,复制一列作为待索取的值。然后同样把文件2的Up_gene/Down_gene复制到新的表格,以逗号分隔符隔开,然后转置。
- 利用VLOOKUP函数根据文件2求文件1中的值,若是有重合值则显示。即所需。
- 以这样的思路完成所有pathway的工作。
方法二:核心就是R语言的intersect函数
h_72 <- read.table("72h_KEGG_enrichment.txt",sep = "\t",header = T,row.names = 1)
h_96 <- read.table("96h_KEGG_enrichment.txt",sep = "\t",header = T,row.names = 1)
pathway_72 <- h_72$Pathway
pathway_96 <- h_96$Pathway
#72_up_vs_96_up
for (i in 1:length(pathway_72)){
pathway_72[i] <- strsplit(h_72$Up_gene[i],split = ",")
}
for (i in 1:length(pathway_96)){
pathway_96[i] <- strsplit(h_96$Up_gene[i],split = ",")
}
up_72_and_96 <- list()
for (i in h_72$Pathway){
index_72 <- match(i,h_72$Pathway)
index_96 <- match(i,h_96$Pathway)
up_72_and_96[i] <- list(intersect(pathway_72[[index_72]],pathway_96[[index_96]]))
}
unlist_up_72_and_96 <- unlist(up_72_and_96)
write.table(unlist_up_72_and_96,"up_72_and_96.txt",sep = "\t")
#72_down_vs_96_down
for (i in 1:length(pathway_72)){
pathway_72[i] <- strsplit(h_72$Down_gene[i],split = ",")
}
for (i in 1:length(pathway_96)){
pathway_96[i] <- strsplit(h_96$Down_gene[i],split = ",")
}
down_72_and_96 <- list()
for (i in h_72$Pathway){
index_72 <- match(i,h_72$Pathway)
index_96 <- match(i,h_96$Pathway)
down_72_and_96[i] <- list(intersect(pathway_72[[index_72]],pathway_96[[index_96]]))
}
unlist_down_72_and_96 <- unlist(down_72_and_96)
write.table(unlist_down_72_and_96,"down_72_and_96.txt",sep = "\t")
总体思路:文件1的pathway含有的基因各自加入到一个列表中,由于和文件2中的pathway名称顺序不对应,所以使用match函数获取文件1的pathway在文件2中的索引,然后取基因集合,intersect进行求值。得到重合的基因,加入到新的列表中,unlist解开列表,write.table写入文件即可。
网友评论