cbind с именами строк в несколько файлов

Я хотел бы использовать cbind в списке файлов. Однако каждый файл разбит на определенную хромосому (chr) (k in 1:29) и конкретный образец (i in 1:777). Файлы такие:

образец1chr1.txt, образец1chr2.txt ... образец1chr29.txt, образец2chr1.txt ... образец777chr29.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

Ожидаемый результат (LRRawallchr1):

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 файлов типа (LRRawallchr1), по одному на Chr. Файлы "LRRawallchr,k" должны иметь размер 777+3 (800 столбцов). 3 названия строк и один столбец для каждого образца.

Ваше здоровье!


person user3091668    schedule 19.04.2014    source источник
comment
Пожалуйста, сделайте этот пример воспроизводимым, включив примеры данных, которые показывают проблему. Включите данные в сам вопрос.   -  person Matthew Lundberg    schedule 19.04.2014
comment
Этого достаточно? Благодарю вас!   -  person user3091668    schedule 19.04.2014


Ответы (3)


Пытаться:

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)
}
person FFI    schedule 19.04.2014

Вы хотите 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

Затем продолжайте объединять в следующих наборах.

person Matthew Lundberg    schedule 19.04.2014
comment
Я не могу слиться. Все данные слишком большие. Я пытаюсь каким-то образом связать один образец за раз. Какой-то способ связать сэмпл1 и записать, связать семпл2 и записать, cбиндить семпл3 и записать.... Дойдя в итоге до всех сэмплов до каждого Chr отдельно... - person user3091668; 19.04.2014

Если порядок строк всегда идентичен для всех файлов и меняется только значение последнего столбца, то можно cbind() только последний столбец каждого файла, где (начиная с k=2):

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

Где infile — это файл, в котором собираются ваши данные, а chr — ваш недавно загруженный файл внутри цикла. Если ваши строки не ранжированы в том же порядке, см. решение @Matthew.

PS: в результате получится файл с более чем 22 тысячами столбцов. Это не лучший формат для большинства процедур в R.

person ilir    schedule 19.04.2014
comment
Моя проблема в том, что мой окончательный результат имеет только один образец, я, значение. Мне интересно, можно ли записать мой вывод и снова прочитать 777 раз (по одному для каждого образца). В результате получается файл со всеми столбцами (3+ 777) в конце. Ваша процедура избавит меня от grep шагов. Я не прав? - person user3091668; 19.04.2014
comment
Нет, вы правы, поэтому я поставил PS в конце. Тогда я предлагаю вам сначала поместить их в длинный набор данных (используя rbind), а затем просмотреть dcast() из пакета reshape2. - person ilir; 19.04.2014