如何从多个文件中取交集?

作者: 宗肃書 | 来源:发表于2021-09-05 15:42 被阅读0次

比如我有很多个文件(100或者1000个以上),每一个文件都包含两列信息,一列是染色体的位置信息,一列是它对应的值,但是这些文件的行数不完全一样。如果我想快速的找到所有文件的交集需要怎么办?

用awk命令或者单纯的写一个脚本可能稍微有点复杂,下面我列出我的解决办法。

  • 1.首先需要保证每个文件的第一列的列名完全一样(便于后续合并)
  • 2.让文件的后缀尽可能的保持一致,比如.txt之类的
  • 3.所有文件放在一个文件夹下
  • 4.使用R语言的merge函数

实操!

  • 在当前目录下打开R软件输入下面的命令
filename=dir(pattern='[A-Z]{2,3}[0-9]{2}.depth')    #根据不同的文件名批量读入文件名字
data<-read.table(file="BC01.depth",header=T)    #把第一个文件读入到data数据集中(目的是为了merge合并的时候,第一个data数据集中存在数据,使结果不为空)
for(k in 2:length(filename)){     #从第二个数据开始读取,因为第一个我们已经读入到data中
    tmp = read.table(file =filename[k], header = T,stringsAsFactors = F)    #依次读入数据,并暂存为tmp,相当于每一个文件数据的中转站
   data<-merge(data,tmp,by="position")   #依次把中转过来的数据与data取交集并生成交集的data数据集(position为每一个文件中相同的列名)
}
write.table(data,file="allfile.depth",sep="\t")
  • 同理,如果取并集的话
filename=dir(pattern='[A-Z]{2,3}[0-9]{2}.depth') 
data<-read.table(file=filename[1],header=T) 
for(k in 2:length(filename)){   
    tmp = read.table(file =filename[k], header = T,stringsAsFactors = F)   
   data<-merge(data,tmp,by="position",all=T)  
}
write.table(data,file="allfilebing.depth",sep="\t")

那什么时候会用到上述的操作呢?

  • 1.做基因组变异数据分析的时候,第一种方法可以用来寻找所有群体的共有snp的存在
  • 2.转录组数据的差异表达分析的时候,取所有有表达量的转录本id 的并集合并数据后得到了样本的转录本的差异表达矩阵

相关文章

网友评论

    本文标题:如何从多个文件中取交集?

    本文链接:https://www.haomeiwen.com/subject/wwmjwltx.html