如何重新排序在函数内创建的相关矩阵的行和列

How to reorder the rows and columns of a correlation matrix created within a function

考虑以下数据框dat1

set.seed(123)
dat1 <- data.frame(Loc = rep(letters[1:20], each = 10),
                   ID = 1:200,
                   var1 = rnorm(200),
                   var3 = rnorm(200),
                   var4 = rnorm(200),
                   var5 = rnorm(200),
                   var6 = rnorm(200))
dat1$ID <- factor(dat1$ID)

以下函数将使用 rstatix 包在 Loc 级别之间为指定的 var 执行 dunn_test,并且它将 return 来自 dunn_test:

的 p 值的相关矩阵
library(rstatix)
dunn.cor <- function(dat, var, gv){
  res <- dat%>% rstatix::dunn_test(as.formula(paste(var, "~", gv)))
  p <- res$p
 dst <- matrix(NA, 20, 20)
 dst[lower.tri(dst)] <- p
 dst <- as.dist(dst)
 attr(dst, "Labels") <- levels(dat1$Loc)
 dst <- as.matrix(dst, upper=TRUE, lower=TRUE)
 diag(dst) <- 1
 dst <- round(dst,2)
 return(dst)
}
#example for var1:
dunn.cor(dat=dat1, var= "var1", gv = "Loc")

我想在函数之外创建一个对象 order 来指定我希望行和列在矩阵中出现的顺序。 例如:

order <- c("m", "l", "n", "h", "p", "j", "r", "k", "c", "d", "f", "o", "t", "i", "g", "s", "e", "q", "b", "a")

澄清一下,我希望矩阵的行和列按此顺序排列,就像常规相关矩阵一样。我如何修改函数以使矩阵的行和列按此顺序排列?

如果我们需要按特定顺序使用它,可以创建一个 factor 并指定 levels

dat1$Loc <- factor(dat1$Loc, levels = order)

然后我们申请

library(dplyr)
library(tidyr)
library(tibble)
out <- dat1 %>% 
   rstatix::dunn_test(var1 ~ Loc) %>%
   select(group1, group2, p) %>%
   pivot_wider(names_from = group2, values_from = p, values_fill = list(p = 0)) %>% 
   column_to_rownames('group1') %>% 
   as.matrix
out1 <- out + t(out)



dimnames(out1)
#[[1]]
# [1] "m" "l" "n" "h" "p" "j" "r" "k" "c" "d" "f" "o" "t" "i" "g" "s" "e" "q" "b"

#[[2]]
# [1] "l" "n" "h" "p" "j" "r" "k" "c" "d" "f" "o" "t" "i" "g" "s" "e" "q" "b" "a"

如果我们需要一个二进制矩阵

out2 <- +(out1 <= 0.05)

并用 corrplot

绘图
corrplot(out2, is.corr = FALSE, type = 'lower')