R:附加到for循环中的数据帧

时间:2015-02-05 15:53:59

标签: r for-loop append

所以我有这个循环,并且它写了多个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))
      }
    }

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圈。