如何从多个文件中取交集?
2021-09-05 本文已影响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 的并集合并数据后得到了样本的转录本的差异表达矩阵