我想在文件列表中使用cbind
。但是,每个文件都分为特定染色体(chr)(k in 1:29)
和特定样本(i in 1:777)
。文件如下:
sample1chr1.txt,sample1chr2.txt ... sample1chr29.txt,sample2chr1.txt ... sample777chr29.txt
所有文件都具有完全相同的行名称(3个第一列代表我的行名称)。我想得到一个最终文件到每个chr合并到所有样本文件,并且不重复最终文件中的行名称(前三列代表我的行名称)。
我试过了:
#Creating file with row names (3 first columns) to each Chr
{
{for(k in 1:29){
infile <- paste0("sample1chr",k,".txt")
outfile <- paste0("LRRrawallchr",k,".txt")
rows <- read.table(infile, header=TRUE, sep="\t")
rows <- rows[, -grep("Log.R.Ratio", colnames(rows))]
write.table(rows, outfile, sep=";")}}
#Cbind in one file per Chr
{ for(i in 1:777)
for(k in 1:29){
base <- paste0("LRRrawallchr",k,".txt")
chr <- read.table(base, header=TRUE, sep=";")
infile <- paste0("sample",i,"chr",k,".txt")
chr2 <- read.table(infile, header=TRUE, sep="\t")
outfile <- paste0("LRRrawallchr",k,".txt")
chr2 <- chr2[, -grep("Name", colnames(chr2))]
chr2 <- chr2[, -grep("Chr", colnames(chr2))]
chr2 <- chr2[, -grep("Position", colnames(chr2))]
chr <- cbind(chr, chr2)
write.table(chr, outfile, sep=";", row.names=FALSE, col.names=FALSE)}
}
输入示例(sample1chr1.txt):
Name Chr Position sample1value
BAC-11034 1 128 0.302
BAC-11044 1 129 -0.56
BAC-11057 1 134 0.0840
输入示例(sample2chr1.txt):
Name Chr Position sample2value
BAC-11034 1 128 0.25
BAC-11044 1 129 0.41
BAC-11057 1 134 -0.14
预期输出(LRRrawallchr1):
Name Chr Position sample1value sample2value
BAC-11034 1 128 0.302 0.25
BAC-11044 1 129 -0.56 0.41
BAC-11057 1 134 0.0840 -0.14
我有22553个不同的.txt文件(29个文件(每个chr一个)到777个样本)。所有22553个文件(sample1chr1.txt,sample1chr2.txt ... sample1chr29.txt,sample2chr1.txt ... sample777chr29.txt)与上面的示例类似。
我想要29个像(LRRrawallchr1)的文件,每个Chr一个。 “LRRrawallchr,k”文件必须是777 + 3(800列)。 3个行名称和每个样本一列。
干杯!
答案 0 :(得分:1)
尝试:
a <- NULL
for(k in 1:29)
{
a <- read.table(paste0("sample1chr", k, ".txt"), header=TRUE, sep="\t")
for(i in 2:777)
{
infile <- read.table(paste0("sample", i, "chr", k, ".txt"), header=TRUE, sep="\t")
a <- merge(a, infile, by = c('Name', 'Chr', 'Position'))
}
write.table(a, paste0("LRRrawallchr", k, ".csv"), append = FALSE, sep = ",", row.names = F)
}
答案 1 :(得分:0)
您想merge
这些集合,而不是cbind
它们。 merge
将根据常用或指定的列名组合行。将前两个读入数据帧后,此命令将生成合并。我正在使用公共列名称进行合并(使用by
),因为您在代码中按这些名称进行过滤。
> merge(sample1chr1, sample1chr2, by=c('Name', 'Chr', 'Position'))
Name Chr Position sample1value sample2value
1 BAC-11034 1 128 0.302 0.25
2 BAC-11044 1 129 -0.560 0.41
3 BAC-11057 1 134 0.084 -0.14
然后继续合并以下几组。
答案 2 :(得分:0)
如果所有文件的行顺序始终相同且只有最后一列的值发生变化,那么您可以cbind()
只显示每个文件的最后一列,其中(从k = 2开始):
infile <- cbind(infile, chr[, 4])
其中infile
是数据收集的文件,chr
是循环内新加载的文件。如果您的行没有按相同顺序排列,请参阅@ Matthew的解决方案。
PS:这将导致一个包含超过22,000列的文件。对于R
中的大多数程序来说,这不是一个好的格式