【问题标题】:R: cofrequency tabel of categorical variables - heatmap / geom_tileR:分类变量的共频表 - heatmap / geom_tile
【发布时间】:2019-07-25 07:14:53
【问题描述】:

您好,我想创建显示多个变量的共频的热图 让我们看一些代码:

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 轴上带有列名,并在瓷砖 % 的共频中 a vs a = 100%,a vs. b = 75% 等等。

我可以请求一些帮助吗?


来自 cmets 的解决方案生成:

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)

【问题讨论】:

    标签: r ggplot2 heatmap categorical-data


    【解决方案1】:

    应该有一个函数直接执行此操作,这是一种使用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()
    

    【讨论】:

    • 有趣的函数,以及如何使用例如 ggplot2 geom_tile 来可视化外部的这个结果?
    • @Mikołaj 我认为您需要重塑数据。类似mat %&gt;% as_tibble() %&gt;% gather %&gt;% ggplot() + aes(key, value) + geom_tile()
    • 嗨,@RonakShah,如果可能的话,你能解释一下这个功能吗?因为我没明白...
    • @PaoloLorenzini Hi..代码的哪一部分你不明白?
    • @PaoloLorenzini 是的,完全正确。因此,在outer 中,我们生成所有可能的列名组合,并在函数中借助这些列名对数据进行子集化,并计算其具有等于 1 值的比率。
    猜你喜欢
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多