2011-08-04 83 views
4

标签DELIM文件合并为一个单一的文件我有几个txt文件3列在这样每个文件: 文件1:,使用R

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 

请你帮帮我。

+0

查看相关问题的组合:http://stackoverflow.com/questions/3764292/loading -many-files-at-once,http://stackoverflow.com/questions/4234179/combine-the-multiple-files-with-one-header,... –

回答

0

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

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

之后,你有你的三个data.frames可以使用

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

看看这里http://www.statmethods.net/management/merging.html的文档。

+1

如果你也证明这个实际上有效(见Joris的回答),那将很有趣。 –

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 (合并,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)) 
+0

我删除了清理注释(最近开始抱怨)关于扩展的评论)。随时也可以这样做。 –

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_recursereshape package

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

这将为dataframes的任何给定数量的工作,只要这不是他们的十亿。有关所用参数的更多信息,请参阅?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 
+1

请注意,merge_recurse中有一个错误,它阻止它使用您传递的其他参数。事实上,merge_recurse(file.list)将产生完全相同的输出。该错误会影响三个或更多数据框的任何合并。 –

0

我要扔另一种方法成采用Reduce

Reduce(function(...) merge(..., all = T), file.list)