R:分类变量的频率表 - 热图 / geom_tile
R: cofrequency tabel of categorical variables - heatmap / geom_tile
你好,我想创建热图来呈现几个变量的共频
让我们看一些代码:
a <- c(1,1,1,1)
b <-c(1,1,1,0)
c<- c(1,1,0,0)
d <- c(1,0,0,0)
df <- cbind(a,b,c,d)
df
a b c d
[1,] 1 1 1 1
[2,] 1 1 1 0
[3,] 1 1 0 0
[4,] 1 0 0 0
'1'代表一个现象的发生
'0'现象没有出现
a和b共频为75%
a和c共频为50%
...
最后,我想要一个 4x4 矩阵,在 x 轴和 y 轴上带有 colnames,并以 % 的共频率表示
a vs a = 100%, a vs. b = 75% 等等
我可以寻求一点帮助吗?
来自评论的解决方案生成:
library(tidyr)
library(ggplot2)
a <- c(1,1,1,1)
b <-c(1,1,1,0)
c<- c(1,1,0,0)
d <- c(1,0,0,0)
df <- cbind(a,b,c,d)
calc_freq <- function(x, y) {
mean(df[, x] == df[, y] & df[, x] == 1 & df[, y] == 1)
}
mat <- outer(colnames(df), colnames(df), Vectorize(calc_freq))
mat
dimnames(mat) <- list(colnames(df), colnames(df))
mat %>% as_tibble() %>% gather %>% ggplot() + aes(key, value) + geom_tile()
我宁愿将 mat
中的 % 作为填充,将 x 轴和 y 轴作为 dinnames(mat)
应该有一个函数可以直接执行此操作,但是,这是一种使用 outer
的基本 R 方法。我们写了一个计算比率的函数
calc_freq <- function(x, y) {
mean(df[, x] == df[, y] & df[, x] == 1 & df[, y] == 1)
}
并使用 outer
应用它
mat <- outer(colnames(df), colnames(df), Vectorize(calc_freq))
mat
# [,1] [,2] [,3] [,4]
#[1,] 1.00 0.75 0.50 0.25
#[2,] 0.75 0.75 0.50 0.25
#[3,] 0.50 0.50 0.50 0.25
#[4,] 0.25 0.25 0.25 0.25
如果您需要行名和列名,我们可以使用 dimnames
dimnames(mat) <- list(colnames(df), colnames(df))
计算同一位置两列中1出现的比例。
为了得到剧情我们可以做
library(tidyverse)
data.frame(mat) %>%
rownames_to_column() %>%
gather(key, value, -rowname) %>%
ggplot() + aes(rowname, key, fill = value) +
geom_tile()
你好,我想创建热图来呈现几个变量的共频 让我们看一些代码:
a <- c(1,1,1,1)
b <-c(1,1,1,0)
c<- c(1,1,0,0)
d <- c(1,0,0,0)
df <- cbind(a,b,c,d)
df
a b c d
[1,] 1 1 1 1
[2,] 1 1 1 0
[3,] 1 1 0 0
[4,] 1 0 0 0
'1'代表一个现象的发生 '0'现象没有出现
a和b共频为75% a和c共频为50% ...
最后,我想要一个 4x4 矩阵,在 x 轴和 y 轴上带有 colnames,并以 % 的共频率表示 a vs a = 100%, a vs. b = 75% 等等
我可以寻求一点帮助吗?
来自评论的解决方案生成:
library(tidyr)
library(ggplot2)
a <- c(1,1,1,1)
b <-c(1,1,1,0)
c<- c(1,1,0,0)
d <- c(1,0,0,0)
df <- cbind(a,b,c,d)
calc_freq <- function(x, y) {
mean(df[, x] == df[, y] & df[, x] == 1 & df[, y] == 1)
}
mat <- outer(colnames(df), colnames(df), Vectorize(calc_freq))
mat
dimnames(mat) <- list(colnames(df), colnames(df))
mat %>% as_tibble() %>% gather %>% ggplot() + aes(key, value) + geom_tile()
我宁愿将 mat
中的 % 作为填充,将 x 轴和 y 轴作为 dinnames(mat)
应该有一个函数可以直接执行此操作,但是,这是一种使用 outer
的基本 R 方法。我们写了一个计算比率的函数
calc_freq <- function(x, y) {
mean(df[, x] == df[, y] & df[, x] == 1 & df[, y] == 1)
}
并使用 outer
mat <- outer(colnames(df), colnames(df), Vectorize(calc_freq))
mat
# [,1] [,2] [,3] [,4]
#[1,] 1.00 0.75 0.50 0.25
#[2,] 0.75 0.75 0.50 0.25
#[3,] 0.50 0.50 0.50 0.25
#[4,] 0.25 0.25 0.25 0.25
如果您需要行名和列名,我们可以使用 dimnames
dimnames(mat) <- list(colnames(df), colnames(df))
计算同一位置两列中1出现的比例。
为了得到剧情我们可以做
library(tidyverse)
data.frame(mat) %>%
rownames_to_column() %>%
gather(key, value, -rowname) %>%
ggplot() + aes(rowname, key, fill = value) +
geom_tile()