【问题标题】:R: For Loop within a For Loop, rebuilding and exporting the output each roundR:For循环中的For循环,每轮重建和导出输出
【发布时间】:2015-01-25 17:34:41
【问题描述】:

所以,我是 R 的新手。

我正在尝试从患者列表 x 中读取患者 ID,提取矩阵 1(基因组矩阵)中的相应列(列名 = 患者姓名),然后运行逐行统计对来自基因组矩阵的那一列和另一个矩阵 (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,然后删除所有这些内容并继续下一个患者。

还有一件事 - 有没有办法让每次运行时更改 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

【问题讨论】:

  • 嗯,它构建 NULL 的 zvalues 的原因可能是你有 3. to last 在你的循环中说zvalues = NULL
  • 另外,你好像有一个 .在 gex.sample 中。但我在任何地方都看不到 gex.sample 定义。从 zvalues 中删除 [i] 以及最后三行应该也会对您有所帮助。

标签: r csv for-loop nested-loops


【解决方案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)
  })
})

【讨论】:

  • 嗨@kristang,感谢您的反馈。这很有帮助。但是,我收到以下错误:paste0(names(listx)[j]) 中的错误:找不到对象'j'
  • 我只是复制/粘贴了您的代码并将循环更改为 lapply :)。正如您在我的代码中看到的那样,在定义 indgene 之后,您的循环实际上是关闭的。您可以尝试在 write.csv 之后将闭包 }) 向下移动,看看是否有帮助。我真的无法确定它是否会立即引起任何麻烦。
  • 我解决了 write.csv 问题。我错误地使用了 paste0。除此之外,似乎没有将 indgene 定义为 gex 中要处理的单个列(就像一次对应一个患者),它只是将所有患者同时放入 indgene 中,所以有 x列数。问题是,如果有多于一列,则无法计算 z 值。您知道如何一次只为 indgene 提供一根色谱柱吗?谢谢!
  • 好吧,就像我说的,当我不知道 gex 的精确结构时,它可能会有点棘手。也许在select 中使用colnames 而不是names 会改变它?
  • 现在附在原帖上的是 gex 的剪报。希望有帮助。谢谢。
猜你喜欢
  • 1970-01-01
  • 2013-05-20
  • 2014-04-15
  • 2015-11-27
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
相关资源
最近更新 更多