【发布时间】:2015-04-05 13:36:12
【问题描述】:
所以我有这个循环,它会写入多个 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))
}
}
【问题讨论】:
-
在循环外声明一个数据框,然后使用
rbind或cbind在循环的每次迭代中添加行或列? -
嘿@SamFirke,感谢您的反馈 - 我如何在仍然利用循环的每次迭代的同时“声明循环外的数据帧”?
-
@SamFirke 这在 R 中通常效率很低——查看 The R Inferno 的第 2 圈。
-
感谢@josilber 的链接,我知道通常要避免 R 中的 for 循环,但不知道内存影响。 @HenriW,请参阅 josilber 的解决方案;您可以像他一样首先创建一个数据框,然后使用
rbind调用附加到循环的每次迭代中 - 但正如他所解释的那样,他使用lapply的解决方案更好。