使用R将制表符分隔文件组合到单个文件中

时间:2011-08-04 13:53:04

标签: r merge dataframe read.table

我有几个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 个答案:

答案 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_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

答案 1 :(得分:2)

读入您的文件

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

将它们合并为一个大数据框

all_data&lt; - do.call(cbind,data_list)

all_data&lt; - 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))

答案 2 :(得分:0)

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

请参阅help(read.delim)了解阅读模式。

获得三个data.frame后,可以使用

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

在此处http://www.statmethods.net/management/merging.html查看文档。

答案 3 :(得分:0)

我将在使用Reduce

的混音中引入另一种方法
Reduce(function(...) merge(..., all = T), file.list)