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()