Объединение файлов с разделителями табуляции в один файл с использованием R - PullRequest
4 голосов
/ 04 августа 2011

У меня есть несколько TXT-файлов с 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

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

Ответы [ 4 ]

4 голосов
/ 04 августа 2011

Прочитайте файлы, указанные Ричи Коттоном, но убедитесь, что вы добавили соответствующие дополнительные аргументы в вызове apply. Для одного, 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
2 голосов
/ 04 августа 2011

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

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

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

all_data <- do.call (cbind, data_list) </del>

all_data <- do.call (объединение, список данных, by = "ProbeID") </del>

Это дает хороший урок, чтобы «всегда концентрироваться при предоставлении ответа». 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))
0 голосов
/ 04 августа 2011

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

Reduce(function(...) merge(..., all = T), file.list)
0 голосов
/ 04 августа 2011

Мой подход заключается в чтении файлов в data.frames

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

После того, как у вас есть три фрейма данных, вы можете использовать

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

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

...