r - 相关矩阵 - tidyrgather v.reshape2melt

标签 r matrix ggplot2 tidyr reshape2

我想使用ggplot2来制作一个上三角相关矩阵,如this one 。我可以很好地复制该函数,但由于某种原因,我一直想将 reshape2 函数转换为 tidyr 函数。我认为我可以使用 gather 代替 melt,但这不起作用。

使用reshape2的原始结果

library(reshape2)
library(ggplot2)
mydata <- mtcars[, c(1,3,4,5,6,7)]
cormat <- round(cor(mydata),2)
library(reshape2)
melted_cormat <- melt(cormat)

# Get upper triangle of the correlation matrix
get_upper_tri <- function(cormat){
    cormat[lower.tri(cormat)]<- NA
    return(cormat)
}

upper_tri <- get_upper_tri(cormat)

melted_cormat <- melt(upper_tri, na.rm = TRUE)

ggplot(data = melted_cormat, aes(Var2, Var1, fill = value)) + 
    geom_tile()

enter image description here

我尝试使用 tidyr 中的 gather 进行此操作。

library(tidyverse)


#first correlatoin matrix
cor_base <- round(cor(mydata), 2)
#now UT
cor_base[lower.tri(cor_base)] <- NA
cor_tri <- as.data.frame(cor_base) %>% 
    rownames_to_column("Var2") %>% 
    gather(key = Var1, value = value, -Var2, na.rm = TRUE) %>% 
    as.data.frame()

ggplot(data = cor_tri, aes(x = Var2, y = Var1, fill = value)) + 
    geom_tile()

enter image description here

这些值都是相同的,但是顺序发生了一些变化,这使得这看起来是错误的。检查identical不会返回TRUE,但两个数据帧的值似乎相同...

> identical(cor_tri, melted_cormat)
[1] FALSE
> dim(cor_tri)
[1] 21  3
> dim(melted_cormat)
[1] 21  3
> sum(cor_tri == melted_cormat)
[1] 63

对此有什么想法,还是我应该继续加载 reshape2 来完成我想要的任务?

谢谢。

最佳答案

本质上,它是 factorcharacter reshape2 和 tidyr 版本之间的 Var1Var2 类型。前者的melt()保留相关矩阵的因子和顺序:"mpg", "disp", "hp", "drat", "wt", "qsec"后者的 tibble:rownames_to_colums()按字母顺序创建字符类型:"disp", "drat", "hp", "mpg", "qsec", "wt" 。正如所见,两者都有不同程度的影响绘图渲染。

要解决此问题,请考虑 dplyr::mutate行使用 base::factor(rownames(.), ... )并将级别显式定义为 cor_base 的 row.names() 的原始排列。另外,您的 Var1Var2 颠倒了。

cor_base <- round(cor(mydata), 2)
cor_base[lower.tri(cor_base)] <- NA

cor_tri <- as.data.frame(cor_base) %>% 
  mutate(Var1 = factor(row.names(.), levels=row.names(.))) %>% 
  gather(key = Var2, value = value, -Var1, na.rm = TRUE, factor_key = TRUE) 

ggplot(data = cor_tri, aes(Var2, Var1, fill = value)) + 
  geom_tile()

Cor Matrix Plot Output

<小时/>

此外,对于您或 future 的读者,这里有 base::reshape也解决了上述因素级别问题的版本:

cor_base <- round(cor(mydata), 2)
cor_base[lower.tri(cor_base)] <- NA

cor_base_df <- transform(as.data.frame(cor_base),
                         Var1 = factor(row.names(cor_base), levels=row.names(cor_base)))

cor_long <- subset(reshape(cor_base_df, idvar=c("Var1"), 
                           varying = c(1:(ncol(cor_base_df)-1)), v.names="value",
                           timevar = "Var2", 
                           times = factor(row.names(cor_base), levels=row.names(cor_base)),
                           new.row.names = 1:100,
                           direction = "long"), !is.na(value))

ggplot(data = cor_long, aes(Var2, Var1, fill = value)) + 
  geom_tile()

关于r - 相关矩阵 - tidyrgather v.reshape2melt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47475897/

相关文章:

r - 从具有多个时区 R 的字符向量中提取时间

matlab - 从 MAT 文件中加载带有索引的特定变量

r - ggplot 和 holt winters 预测

r - 在 R 中创建连续的一维热图

r - 使用 seq() 创建一个规则的日期时间序列 (POSIXct)

r - 图例中的一些 bin 间隔未使用 ggplot 着色

r - 将字符转换为 R 中公式中使用的变量名称

python - 裁剪矩阵的 nan 行和列,但保持正方形

函数 strfind 上的 Matlab cellfun

r - 向 ggalt::geom_dumbbell 图添加图例并对 y 轴进行排序