【问题标题】:Creating a matrix of co-occurence from many variables, and plotting it从许多变量创建一个共现矩阵,并绘制它
【发布时间】:2019-02-08 10:19:08
【问题描述】:

我有一组患有多种健康状况的人的数据集。个人要么做(1)要么不(0)有每个条件(我的真实数据集有14个)。我想做的是总结数据,这样我就知道成对的条件发生的频率。请注意,有些人可能有三个或四个条件,但我感兴趣的是成对共现。然后我想将其绘制为热图。

我怀疑解决方案涉及 tidyr 的“收集”功能,但我无法解决。这是我的输入的外观和我想要实现的示例:

这里有一些关于个人的数据,以及他们是否有条件“a”、“b”或“c”:

library(tidyverse)
library(viridis)

dat <- tibble(
  id = c(1:15),
  a = c(1,0,0,0,1,1,1,0,1,0,0,0,1,0,1),
  b = c(1,0,0,1,1,1,0,0,1,0,0,1,1,0,1),
  c = c(0,0,1,1,0,1,0,1,0,1,1,0,1,1,0))

我想总结一下每种情况发生的频率,以及它们同时发生的频率。在这种情况下,很明显,条件“a”和“b”同时出现的频率高于其中任何一个与“c”一起出现的频率,后者通常单独出现。下面是我想象中的数据在可绘图格式中的样子。第一列是“变量 1”,第二列是“变量 2”,第三列是这些变量一起出现的频率。下面是我脑海中的情节。

plotdat <- tibble(
  var1 = c("a", "a", "a", "b", "b", "c"),
  var2 = c("a", "b", "c", "b", "c", "c"),
  count = c(7, 6, 2, 8, 3, 8))

ggplot(plotdat) +
  geom_tile(aes(var1, var2, fill = count)) +
  scale_fill_viridis()   

也许这根本不是正确的方法,我实际上需要将数据转换为 3x3 矩阵。任何可能的解决方案将不胜感激!

【问题讨论】:

    标签: r dplyr tidyr


    【解决方案1】:

    这是一种方法

    library(tidyverse)
    as.matrix(dat[-1]) %>% 
      crossprod() %>% 
      `[<-`(upper.tri(.), NA) %>% 
      as.data.frame() %>% 
      rownames_to_column() %>% 
      gather(key, value, -rowname) %>%
      filter(!is.na(value))
    #  rowname key value
    #1       a   a     7
    #2       b   a     6
    #3       c   a     2
    #4       b   b     8
    #5       c   b     3
    #6       c   c     8
    

    我认为最重要的部分是crossprod。但是让我们一步一步来。

    您不需要列 id,因此我们将其排除并将 dat[-1] 转换为矩阵,因为这是 crossprod 所期望的。

    as.matrix(dat[-1]) %>% 
      crossprod()
    #  a b c
    #a 7 6 2
    #b 6 8 3
    #c 2 3 8
    

    然后我们用NA替换这个矩阵的上三角,因为你不想比较a-bb-a等等。

    下一步是转换为数据框,将行名设为一列,然后从宽变为长

    as.matrix(dat[-1]) %>% 
      crossprod() %>% 
      `[<-`(upper.tri(.), NA) %>% 
      as.data.frame() %>% 
      rownames_to_column() %>% 
      gather(key, value, -rowname)
    #  rowname key value
    #1       a   a     7
    #2       b   a     6
    #3       c   a     2
    #4       a   b    NA
    #5       b   b     8
    #6       c   b     3
    #7       a   c    NA
    #8       b   c    NA
    #9       c   c     8
    

    最后删除NAs 以获得所需的输出。

    【讨论】:

    • @AdamHayward 很高兴它成功了。考虑accept the answer,以便您的问题可以标记为已解决。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    相关资源
    最近更新 更多