0

我想cbind在文件列表中使用。但是,每个文件都拆分为特定的染色体 (chr)(k in 1:29)和特定的样本(i in 1:777)。这些文件是这样的:

sample1chr1.txt,sample1chr2.txt ... sample1chr29.txt,sample2chr1.txt ... sample777chr29.txt

所有文件都具有完全相同的行名(前 3 列代表我的行名)。我想为每个合并到所有示例文件的 chr 获取一个最终文件,并且不要重复最终文件中的行名(前 3 列代表我的行名)。

我试过这个:

#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 行名称和一列。

干杯!

4

3 回答 3

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)
}
于 2014-04-19T18:41:47.790 回答
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

然后继续在以下集合中合并。

于 2014-04-19T14:51:11.737 回答
0

如果所有文件的行顺序始终相同并且只有最后一列的值发生变化,那么您cbind()只能更改每个文件的最后一列,其中(从 k=2 开始):

infile <- cbind(infile, chr[, 4])

infile您的数据收集的文件在哪里,以及您chr在循环中新加载的文件在哪里。如果您的行未按相同顺序排列,请参阅@Matthew 的解决方案。

PS:这将导致文件超过 22000 列。对于 R 中的大多数程序来说,这不是一个好的格式

于 2014-04-19T15:00:27.320 回答