cbind与行名称到几个文件

时间:2014-04-19 14:02:18

标签: r merge split cbind

我想在文件列表中使用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个行名称和每个样本一列。

干杯!

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

中的大多数程序来说,这不是一个好的格式