Объединение файлов разделителей табуляции в один файл с помощью R

У меня есть несколько текстовых файлов с 3 столбцами в каждом файле, например: файл 1:

ProbeID X_Signal_intensity X_P-Value   
xxx         2.34          .89
xxx         6.45          .04 
xxx         1.09          .91  
xxx         5.87          .70
.            .            . 
.            .            .
.            .            .     

файл 2:

ProbeID Y_Signal_intensity Y_P-Value   
xxx         1.4             .92
xxx         2.55            .14 
xxx         4.19            .16  
xxx         3.47            .80
.            .               . 
.            .               .
.            .               . 

файл 3:

ProbeID Z_Signal_intensity Z_P-Value   
xxx         9.40             .82
xxx         1.55            .04 
xxx         3.19            .56  
xxx         2.47            .90
.            .               . 
.            .               .
.            .               . 

Во всех вышеперечисленных файлах значения столбца ProbeID идентичны, но не другие столбцы. Теперь я хочу объединить все вышеперечисленные файлы с помощью for-loop в один файл, например:

ProbeID X_intensity X_P-Value   Y_intensity Y_P-Value   Z_intensity Z_P-Value     
xxx      2.34          .89       1.4             .92     9.40            .82
xxx      6.45          .04       2.55            .14     1.55            .04
xxx      1.09          .91       4.19            .16     3.19            .56
xxx      5.87          .70       3.47            .80     2.47            .90

Пожалуйста, помогите мне.


person Dinesh    schedule 04.08.2011    source источник
comment
См. связанные вопросы: stackoverflow.com/questions/3764292/loading -many-files-at-once , stackoverflow.com/questions/4234179/ , ...   -  person Joris Meys    schedule 04.08.2011


Ответы (4)


Мой подход состоит в том, чтобы читать файлы в data.frames

см. help(read.delim) для режимов чтения.

После того, как у вас есть три data.frames, вы можете использовать

total <- merge(dataframeA,dataframeB,by="ProbeID")

посмотрите здесь http://www.statmethods.net/management/merging.html для документации .

person Sarah West    schedule 04.08.2011
comment
Было бы забавно, если бы вы также продемонстрировали, что это действительно работает (см. ответ Джориса). - person Roman Luštrik; 04.08.2011

Прочитайте файлы, предоставленные Ричи Коттоном, но убедитесь, что вы добавили соответствующие дополнительные аргументы в вызове применения. Во-первых, вероятно, следует добавить header=TRUE.

file.names <- c("file X.txt", "file Y.txt", "file Z.txt")
file.list <- lapply(file.names, read.table, header=TRUE)

Тогда вам, вероятно, понадобится merge_recurse из reshape package :

require(reshape)
mynewframe <- merge_recurse(file.list,all.x=TRUE,all.y=TRUE,by="ProbeID")

Это будет работать для любого заданного количества кадров данных, если их не миллиард. Дополнительные сведения об используемых аргументах см. на странице справки ?merge.

ИСПРАВЛЕНИЕ: в merge_recurse вы должны использовать all.x и all.y, как показано в исправлении выше. Вы не можете просто использовать ярлык all, иначе вы получите ошибки.

Небольшая демонстрация:

X2 <- data.frame(ProbeID=(2:4),Z2=4:6)
X1 <- data.frame(ProbeID=1:3,Z1=1:3)
X3 <- data.frame(ProbeID=1:3,Z3=7:9)
file.list <- list(X1,X2,X3)
mynewframe <- merge_recurse(file.list,all.x=TRUE,all.y=TRUE,by="ProbeID")
> mynewframe
  ProbeID Z1 Z2 Z3
1       1  1 NA  7
2       2  2  4  8
3       3  3  5  9
4       4 NA  6 NA
person Joris Meys    schedule 04.08.2011
comment
Обратите внимание, что в функции merge_recurse есть ошибка, которая не позволяет использовать дополнительные аргументы, которые вы передаете. На самом деле, merge_recurse(file.list) выдаст точно такой же результат. Ошибка затрагивает любое слияние трех или более фреймов данных. - person Chris Warth; 18.04.2014

Читать в ваших файлах

filenames <- c("file X.txt", "file Y.txt", "file Z.txt")
data_list <- lapply(filenames, read.table)

Объедините их в один большой фрейм данных

all_data ‹- do.call(cbind, data_list)

all_data ‹- do.call(merge, data_list, by = "ProbeID")

Это дает хороший урок «всегда концентрироваться при ответе». cbind недостаточно умен для сопоставления идентификаторов, а merge недостаточно умен для обработки более двух фреймов данных. Взгляните на ответ Йориса и используйте вместо него merge_recurse. Или забудьте, что, как вы думали, вы хотели, и используйте мой другой ответ ниже.


На самом деле, лучше иметь не много столбцов, а всего 4 столбца: ProbeID, Signal_intensity, P_value и Source_file.

data_list <- lapply(data_list, function(x) {
  colnames(x) <- c("ProbeID", "Signal_intensity", "P_value")
  x
})

all_data <- do.call(rbind, data_list)
all_data$Source_file <- rep(filenames, times = sapply(data_list, nrow))
person Richie Cotton    schedule 04.08.2011
comment
Я удалил комментарии для очистки (в последнее время SO начинает жаловаться на расширенные комментарии). Не стесняйтесь делать это тоже. - person Joris Meys; 04.08.2011

Я собираюсь добавить еще один подход, который использует Reduce

Reduce(function(...) merge(..., all = T), file.list)
person Ramnath    schedule 04.08.2011