匹配目录中所有文件之间的所有行

时间:2015-02-07 17:53:02

标签: r data.table

我在目录中有大约150个文件,这些文件是同一个实验的复制品,但它们之间在行数方面存在差异

它们都具有以下格式

Chr,Bases          
chr1,189           
chr1,1465             
chr1,7845           
chr1,12844  

我想保留每个文件中出现的“Bases”,因此任何特定文件的行也在每个其他文件中。 我认为最简单的方法是获取行数最少的文件,并使用它来匹配其他文件中的行

library(data.table)
#get smallest file
smallest.file <- data.table(read.table='smallest_file.txt', header=T, sep=',')
setkey(smallest.file, Bases)
#get others
other.files <- list.files(pattern="*.bed", full.names=T)

#function to match Bases between those in the smallest file
#and the others
match_bases <- function (i)  {
others <- data.table(read.table(i, header=T, sep=','))
setkey(others, Bases)
match_result <- smallest.file[others, allow.cartesian=TRUE] [
Bases==Bases, list(Chr=Chr, Bases)]
#write results to a new file
this_file <- paste0(i, ".csv")
write.table(bases, file=this_file, sep=',', row.names=F, quote=F)
}


sapply(other.files, match_bases) #preform function for each file

这似乎有效。

但是我意识到之后,我遇到的问题是缺少的行是随机的,因此“最小文件”中的某些行也是该文件的唯一行,而在其他文件中看不到。

因此,我认为我可以使用的第二种方法是合并所有文件并保留重复150次的行(在每个文件中都可以看到它们)

我查看了duplicated()函数来执行此操作,但我没有看到这种方法可行。我认为它可能也不是最有效的方式。

1 个答案:

答案 0 :(得分:2)

也许这可行,想法是使用all = T合并所有数据帧,以便在缺少值时添加NA,并删除任何具有NA的行:

library(data.table)
#get the files
files<- list.files(".", pattern="*.txt")

#read them in a list
data <- lapply(files, function(x){fread(x,header=T,sep=",")})
#rename the Chr colum to Chr_nameoffile
mapply(function(x,y){setnames(y,c(paste("Chr_",x,sep=""),"Bases"))},files,data)



#merge all the data frames
mergedData<-Reduce(function(...) merge(...,all=T,by="Bases"),data)

#Take only those without NAs
mergedData<-mergedData[apply(mergedData,1,function(x){sum(is.na(x))==0}),]

#split the data frame into files of the correct name, using the Chr_nameoffile column
for (i in 2:ncol(mergedData)){
      fileToWrite<-paste("new",unlist(strsplit(colnames(mergedData[,c(1,i),with=F])[2],"_"))[2],sep="_")
      write.table(mergedData[,c(i,1),with=F], file=fileToWrite, sep=',', row.names=F, quote=F)
}