所以我有这个循环,并且它写了多个csv文件,每个文件都已经从运行结果中追加了。如下所示,此特定循环在gex与mxy的子集的每一行之间运行统计函数(zScore),然后发布每行的结果,然后移动到gex的下一个子集。
我的问题是,有没有一种方法可以在循环中构建一个看起来相同的数据帧,而不是将附加结果写为csv文件?
感谢您的帮助。
gex <- data.frame("sample" = c("BIX","HEF","TUR","ZOP","VAG"),
"TCGA-F4-6703-01" = runif(5, -1, 1),
"TCGA-DM-A28E-01" = runif(5, -1, 1),
"TCGA-AY-6197-01" = runif(5, -1, 1),
"TCGA-A6-5657-01" = runif(5, -1, 1))
colnames(gex) <- gsub("[.]", "_",colnames(gex))
listx <- c("TCGA_DM_A28E_01","TCGA_A6_5657_01")
mxy <- data.frame("TCGA-AD-6963-01" = runif(5, -1, 1),
"TCGA-AA-3663-11" = runif(5, -1, 1),
"TCGA-AD-6901-01" = runif(5, -1, 1),
"TCGA-AZ-2511-01" = runif(5, -1, 1),
"TCGA-A6-A567-01" = runif(5, -1, 1))
colnames(mxy) <- gsub("[.]", "_",colnames(mxy))
zScore <- function(x,y)((as.numeric(x) - as.numeric(rowMeans(y,na.rm=T)))/as.numeric(sd(y,na.rm=T)))
for(i in seq(nrow(mxy))){
for(colName in listx){
zvalues <- zScore(gex[i,colName],
mxy[i,])
geneexptest <- data.frame(gex$sample[i], zvalues, row.names = NULL,
stringsAsFactors = TRUE)
write.table(geneexptest, file = paste0(colName, "mxyinput", ".csv"),
row.names=FALSE, col.names=FALSE, quote=F,
sep = ",", dec = ".", append=(i > 1))
}
}
答案 0 :(得分:2)
在您发布的代码中,您为listx
的每个元素都有一个csv文件,并且您将逐个写入多个行到这些文件中。相反,您可以为listx
的每个元素创建一个数据框,并通过一次调用write.table
来写出每个元素。
dfs <- lapply(listx, function(colName) {
do.call(rbind, lapply(seq(nrow(mxy)), function(i) {
zvalues <- zScore(gex[i,colName], mxy[i,])
data.frame(gex$sample[i], zvalues, row.names = NULL, stringsAsFactors = TRUE)
}))
})
dfs
# [[1]]
# gex.sample.i. zvalues
# 1 BIX 1.1105593
# 2 HEF 0.5451948
# 3 TUR -1.4060388
# 4 ZOP -1.4218218
# 5 VAG 0.2780513
#
# [[2]]
# gex.sample.i. zvalues
# 1 BIX 2.0607386
# 2 HEF 1.6703912
# 3 TUR 1.3249181
# 4 ZOP 0.8865058
# 5 VAG 1.5289732
现在,您可以使用write.table
输出每列的完整数据框。
在一次调用rbind
中将所有数据帧组合在一起将比在每次循环迭代时调用rbind
更有效率;有关详细信息,请参阅The R Inferno的第2圈。