相关矩阵 - tidyr gather v. reshape2 melt
Correlation Matrix - tidyr gather v. reshape2 melt
我想用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()
我尝试使用 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()
这些值都是一样的,但顺序发生了一些变化,这使得它看起来不对。 identical
的检查没有 return 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
以完成我的目标?
谢谢。
本质上就是reshape2和reshape2之间Var1和Var2的factor
和character
类型整洁的版本。前者的melt()
保留因子和相关矩阵的顺序:"mpg", "disp", "hp", "drat", "wt", "qsec"
,后者的tibble:rownames_to_colums()
按字母顺序创建字符类型:"disp", "drat", "hp", "mpg", "qsec", "wt"
。正如所见,两者都有不同的级别影响情节渲染。
要解决,请考虑使用 base::factor(rownames(.), ...
) 的 dplyr::mutate
行,并将级别明确定义为 cor_base 的 row.names()
的原始排列。此外,您的 Var1 和 Var2 被颠倒了。
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()
此外,对于您或未来的读者来说,这里的 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()
我想用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()
我尝试使用 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()
这些值都是一样的,但顺序发生了一些变化,这使得它看起来不对。 identical
的检查没有 return 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
以完成我的目标?
谢谢。
本质上就是reshape2和reshape2之间Var1和Var2的factor
和character
类型整洁的版本。前者的melt()
保留因子和相关矩阵的顺序:"mpg", "disp", "hp", "drat", "wt", "qsec"
,后者的tibble:rownames_to_colums()
按字母顺序创建字符类型:"disp", "drat", "hp", "mpg", "qsec", "wt"
。正如所见,两者都有不同的级别影响情节渲染。
要解决,请考虑使用 base::factor(rownames(.), ...
) 的 dplyr::mutate
行,并将级别明确定义为 cor_base 的 row.names()
的原始排列。此外,您的 Var1 和 Var2 被颠倒了。
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()
此外,对于您或未来的读者来说,这里的 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()