我在目录中有大约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()
函数来执行此操作,但我没有看到这种方法可行。我认为它可能也不是最有效的方式。
答案 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)
}