R 将具有行名称的cbind绑定到多个文件

R 将具有行名称的cbind绑定到多个文件,r,merge,split,cbind,R,Merge,Split,Cbind,我想在文件列表中使用cbind。然而,每个文件在一个特定的染色体(chr)(1:29中的k),和特定的样本(1:777中的i)。这些文件如下所示: sample1chr1.txt,sample1chr2.txt。。。sample1chr29.txt,sample2chr1.txt。。。sample777chr29.txt 所有文件都有完全相同的行名称(前3列表示我的行名称)。我希望每个chr都有一个最终文件合并到所有示例文件中,并且不要重复最终文件中的行名称(前3列表示我的行名称) 我试过这个:

我想在文件列表中使用
cbind
。然而,每个文件在一个特定的染色体(chr)
(1:29中的k)
,和特定的样本
(1:777中的i)
。这些文件如下所示:

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)}
}
输入示例(sample2chr1.txt):

预期输出(LR1):

我有22553个不同的.txt文件(777个样本中的每个样本有29个文件(每个chr一个)。所有22553个文件(sample1chr1.txt、sample1chr2.txt…sample1chr29.txt、sample2chr1.txt…sample777chr29.txt)与上述示例类似

我想要29个文件,比如(LRRrawallchr1),每个Chr一个。“LRRrawallchr,k”文件必须与777+3(800个collumns)一起使用。每个示例包含3个行名称和一个列


干杯

您希望
合并这些集合,而不是
cbind
它们<代码>合并
将根据常用或指定的列名合并行。将前两个数据帧读入数据帧后,此命令生成合并。当您在代码中按这些名称进行筛选时,我提供了要合并的公共列名(使用
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

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

如果所有文件的行顺序始终相同,并且只有最后一列的值更改,则您可以
cbind()
仅更改每个文件的最后一列,其中(从k=2开始):

infle试试:


a请通过包含显示问题的示例数据,使其成为一个可重复的示例。把数据包括在问题本身中就足够了吗?非常感谢。我不能合并。所有数据都太大了。我正在尝试某种方法,每次绑定一个样本。找到样本1,然后写,cbind-sample2,然后写,cbind-sample3,然后写。。。。最终将所有样本分别传递到每个Chr…我的问题是,我的最终结果只有一个“样本,i,值”。我想知道是否有可能写我的输出,并再次阅读777次(每个样本一次)。最终生成一个包含所有collumns(3+777)的文件。你的程序只是让我省去了
grep
步骤。我错了?不,你是对的,这就是为什么我把PS放在最后。然后我建议您首先将它们放在一个长数据集中(使用
rbind
),然后从包
restrape2
中查看
dcast()
Name       Chr  Position      sample2value
BAC-11034   1   128            0.25
BAC-11044   1   129            0.41
BAC-11057   1   134           -0.14
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
> 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
infile <- cbind(infile, chr[, 4])
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)
}