4

我有几个 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 循环将上述所有文件组合成一个文件,如下所示:

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 回答 4

4

阅读 Richie Cotton 给出的文件,但请确保在 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.xall.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
于 2011-08-04T14:05:41.063 回答
2

读入你的文件

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不够聪明,无法进行 ID 匹配,merge也不够聪明,无法处理两个以上的数据帧。看看 Joris 的答案并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))
于 2011-08-04T13:57:54.617 回答
0

我的方法是将文件读入 data.frames

查看help(read.delim)阅读模式。

拥有三个 data.frames 后,您可以使用

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

在这里查看http://www.statmethods.net/management/merging.html以获取文档。

于 2011-08-04T13:59:45.357 回答
0

我将在混合中使用另一种方法Reduce

Reduce(function(...) merge(..., all = T), file.list)
于 2011-08-04T19:19:34.960 回答