【问题标题】:Make a adjacency matrix in R在R中制作邻接矩阵
【发布时间】:2020-08-16 15:15:45
【问题描述】:

我想从包含几行的数据框 (mydata) 中创建一个邻接矩阵,并遵循以下规则:

  1. 以方阵形式列出所有字母
  2. 从对应行的其余列 (p1 p2 p3 p4 p5) 计算和求和来自 source 的连接数。例如,ba(2 行和 8 行)连接了 5 次。
  3. 如果source 中不包含字母,则连接值应为零。

数据框是:

mydf <- data.frame(p1=c('a','a','a','b','g','b','c','c','d'),
                               p2=c('b','c','d','c','d','e','d','e','e'),
                               p3=c('a','a','c','c','d','d','d','a','a'),
                               p4=c('a','a','b','c','c','e','d','a','b'),
                               p5=c('a','b','c','d','I','b','b','c','z'),
                               source=c('a','b','c','d','e','e','a','b','d'))

邻接矩阵应该如下

        a b c d e g I z
      a 4 2 1 3 0 0 0 0
      b 5 1 3 0 1 0 0 0
      c 1 1 2 1 0 0 0 0
      d 1 2 3 2 1 0 0 1
      e 0 2 1 3 2 1 1 0
      g 0 0 0 0 0 0 0 0
      I 0 0 0 0 0 0 0 0
      z 0 0 0 0 0 0 0 0

我有数百列和数千行。我希望有任何最快的方法在 R 中做到这一点

【问题讨论】:

    标签: r dplyr igraph tidyr adjacency-matrix


    【解决方案1】:

    在base R中,我们可以使用table

    vals <- unlist(mydf[-ncol(mydf)])
    table(factor(rep(mydf$source, ncol(mydf) - 1), levels = unique(vals)), vals)
    
    #  vals
    #    a b c d e g I z
    #  a 4 2 1 3 0 0 0 0
    #  b 5 1 3 0 1 0 0 0
    #  g 0 0 0 0 0 0 0 0
    #  c 1 1 2 1 0 0 0 0
    #  d 1 2 3 2 1 0 0 1
    #  e 0 2 1 3 2 1 1 0
    #  I 0 0 0 0 0 0 0 0
    #  z 0 0 0 0 0 0 0 0
    

    tidyverse 我们可以这样做:

    library(dplyr)
    library(tidyr)
    
    mydf %>%
      pivot_longer(cols = -source) %>%
      count(source, value) %>%
      pivot_wider(names_from = value, values_from = n) %>%
      complete(source = names(.)[-1]) %>%
      mutate_all(~replace_na(., 0))
    

    【讨论】:

    • 真实数据中行名和列名的顺序不同。
    • 没有。计算正确,但顺序不理想。
    • 您想要的顺序是什么?你能把它包括在例子中吗?
    • 没有具体的顺序。我需要的是相同的序列。在您上面的解决方案中,a、b、c、d、e、g、I、z 是列名,但行名具有不同的顺序(a、b、g、c、d.)。你明白我的意思吗?
    • @Discovery2020 你的意思是这样的? table(factor(rep(mydf$source, ncol(mydf) - 1), levels = unique(vals)), factor(vals, levels = unique(vals))) ?您可以根据自己的选择分配levels
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    相关资源
    最近更新 更多