我有几个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
请帮助我。
答案 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.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
答案 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")
答案 3 :(得分:0)
我将在使用Reduce
Reduce(function(...) merge(..., all = T), file.list)