【问题标题】:Looping over matrices循环矩阵
【发布时间】:2021-08-02 08:13:49
【问题描述】:

感谢您的帮助!

我有 2 个矩阵:Mx1 和 Mx2 我想通过在 R 环境中循环选定的矩阵来使用 pheatmap 制作热图

我试过了:

Matrices_list <- c(Mx1, Mx2)
for( i in Matrices_list_list ){pheatmap(i, filename= "i.pdf")}

但显然不起作用 问题是 Df_list 现在是两个 Mx 的合并,而不是我无法循环的 2 个不同数据集。它在组合 Df_list 的每个元素中循环

期望的输出:

pheatmap(Mx1, filename="Mx1.pdf")
pheatmap(Mx2, filename="Mx2.pdf")

再次感谢您的帮助:)

【问题讨论】:

  • matrices_list &lt;- list(Mx1 = Mx1, Mx2 = Mx2) ; for(i in names(matrices_list)) pheatma(matrices_list[[i]], filename = paste0(i, ".png"))

标签: r loops environment pheatmap


【解决方案1】:

matrix 是带有dimension 属性的vector(通常是二维的)。在两个矩阵上使用c 函数,删除维度属性并返回单个一维向量,其中length 等于length(Mx1) + length(Mx2)

如 cmets 所示,如果我们需要将 matrix 保留为自身,则将其存储在 list 中,并将 names 属性作为各个矩阵的对象名称。使用dplyr::lst,默认情况下它会生成listnames 作为对象名称

library(dplyr)
Matrices_list <- lst(Mx1, Mx2)

关于 OP 帖子中使用的 for 循环

for(i in Matrices_list ){...

i 是单独的矩阵元素,它没有任何名称属性。这可以另外描述为for 每个循环,即对于“矩阵列表”的每个元素“x”。在其他语言(例如 C++)中,for each 语法将是

for(auto i : Matrices_list) {...

不是循环遍历对象元素,而是遍历序列

for(i in seq_along(Matrices_list)) {...

names 属性,提取这些元素和相应的名称来构造文件名。


使用 tidyverse,我们可以使用 imapiwalk 与矩阵元素 .x.y 的名称 list 或索引(如果名称不存在)

library(purrr)
library(stringr)
imap(Matrices_list, ~ pheatmap(.x, filename = str_c(.y, ".pdf")))
iwalk(Matrices_list, ~ pheatmap(.x, filename = str_c(.y, ".pdf")))

imap/iwalk 的不同之处在于iwalk 不会在控制台上打印返回值。

【讨论】:

    猜你喜欢
    • 2011-12-16
    • 2021-05-24
    • 2016-08-21
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多