R:对于For循环内的循环,每轮重建和导出输出

时间:2015-01-25 17:34:41

标签: r csv for-loop nested-loops

所以,我是R的新手。

我正在尝试从患者列表中读取患者ID,并在矩阵1(genomicmatrix)中提取相应的列(列名=患者姓名),然后运行逐行统计来自genomicmatrix的那一列与另一个矩阵(mxy)之间的分析,两者都有相同的行数。

然后,它将结果写入CSV文件。

然后,它转到listx中的下一个病人并重复该过程。

同样,我是新来的,所以我希望我能够清楚。这就是我到目前为止所拥有的:

for(i in seq_along(mxy)){
  for (j in seq_along(listx)){
    indgene <- try(gex[,listx[j][listx[j] %in% names(gex)]])
  }
  zvalues[i] <- (indgene[i] - mean(mxy[i,])) / sd(mxy[i,])
  geneexptest <- data.frame(gex$sample, zvalues, row.names = NULL, stringsAsFactors = FALSE)
  write.table(geneexptest$gex.sample, paste(names(listx)[j], ".csv", sep = ","), 
          row.names=FALSE, col.names=FALSE, sep=",", quote=F)
  zvalues = NULL
  indgene = NULL
  geneexptest = NULL
}

所以我知道它有点混乱。它不起作用。它只是无休止地在zvalue中构建了一堆NA。我希望它构建一个indgene载体,使用它来填充该病人的zvalues,制作数据帧并将其写为csv,然后删除所有这些东西并继续使用NEXT患者。

还有一件事 - 有没有办法让每次运行都改变CSV文件的名称(比如当前正在查看患者ID后的名称?),这样最终输出就是x个CSV文件,每个对应于listx中的患者。

非常感谢!!

gex

     sample TCGA-F4-6703-01 TCGA-DM-A28E-01 TCGA-AY-6197-01 TCGA-A6-5657-01
[1,]    987      0.79790041       2.3517004       1.7580004       0.6067004
[2,]   7829     -1.13418473      -1.4130847      -2.3078847       0.2550153
[3,]  15097     -0.45561492      -0.4556149      -0.4556149      -0.4556149
[4,]  15056      0.03217751      -0.1146225       0.1363775      -0.3028225
[5,]  15058     -0.31903849      -1.2251385      -1.2339385      -0.8575385
[6,]  15072     -0.19546513      -0.4911651      -0.7853651      -1.2155651


listx <- c("TCGA-DM-A28E-01","TCGA-A6-5657-01")

mxy

     TCGA-AD-6963-01 TCGA-AA-3663-11 TCGA-AD-6901-01 TCGA-A6-A567-01
[1,]       1.0513004       1.2421004       1.5119004       1.6991004
[2,]      -0.7592847       3.2265153      -0.8288847      -0.4752847
[3,]      -0.4556149      -0.4556149      -0.4556149      -0.4556149
[4,]      -0.3492225       0.1348775      -0.1155225      -0.3586225
[5,]      -1.7248385       0.0427615      -1.5324385      -0.3399385
[6,]      -0.8287651      -0.3504651      -0.5890651      -0.1925651

1 个答案:

答案 0 :(得分:1)

好。鉴于你的例子中的信息,我把它放在一起。

首先,我只是代替你生成随机数(因为我在复制sample后变得懒惰)。

其次,因为您要将其保存为.csv文件,所以我更改了colnames的结构。您的患者标识符中包含-作为分隔符,但R中的colnames会将其替换为.

如果您刚刚使用listx中的相同标识符,则在创建.csv文件的名称时,最终会得到:TCGA.DM.A28E.01.csv。但是,如果要保存.csv文件或其他名为.A28E.01.csv的格式,您的文件系统将如何知道。

这就是每个data.frame之后都有gsub行的原因。

gex <- data.frame("sample" =  c(987,7829,15056,15058,15072), 
              "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-A6-A567-01" = runif(5, -1, 1)) 

colnames(mxy) <- gsub("[.]", "_",colnames(mxy))

lapply(1:length(mxy), function(i){
  lapply(1:length(listx), function(j){
    indgene <- gex[listx[j]]

    zvalues <- (indgene[i] - mean(mxy[,i])) / sd(mxy[,i]) 
    geneexptest <- data.frame(gex$sample, zvalues, row.names = NULL, 
                          stringsAsFactors = FALSE)
    write.csv(geneexptest, file = paste0(listx[j], ".csv"), 
          row.names=FALSE, col.names=FALSE, sep=",", quote=F)
  })
})