【问题标题】:Creating a directed adjacency matrix from a dataframe with many columns从具有多列的数据框创建有向邻接矩阵
【发布时间】:2022-12-20 08:11:09
【问题描述】:

我想从这样的数据创建一个有向邻接矩阵:

x1 x2 x3 x4 x5 x6 x7 x8
1 1 1 1 1 1 1 2
22 22 22 3 3 3 2 3
3 3 3 5 5 2 3 23

其中列代表时间状态。

邻接矩阵应反映以下逻辑:

对于列 x1:1个应该转到 x2 列中的 3 行,

22应该转到 x2 列中的 3 行,

3个应该转到 x2 列中的 3 行

对于 x2 列:相同的模式转到 x3 列。 这适用于所有列。所以这就像将给定列中的每个元素链接到下一列的所有元素,依此类推。

输出应该是一个列和行为 N x N 的矩阵(其中 N 是整个矩阵中唯一值的数量)和......好吧,一个邻接矩阵。

这个数据框只是一个示例,我必须使用的那个有数百列。

对于这 8 列,输出应类似于以下内容:

1 2 3 5 22 23
1 6 1 0 0 0 0
2 0 0 2 0 0 0
3 0 1 4 1 0 1
5 0 1 0 1 0 0
22 0 0 1 0 2 0
23 0 0 0 0 0 0

这是图形应该是什么样子的表示。 (编辑)

我一直在努力让它发挥作用,但现在我真的迷路了...... TIA

附言我正在使用 R,但 Python 也可以。

【问题讨论】:

  • 仍然不清楚输出。你能显示输出的前 5 行吗
  • 为什么输出的右上角单元格中有一个 6? 6代表什么?在任何情况下,邻接矩阵的前导对角线都应为零(节点未连接到自身)。
  • 不同于 0 的对角线元素表示循环。我理解你的问题,因为循环通常以不同的方式表示,但在这种情况下,6 表示值 1 与自身连接 6 次。我可能在结构上搞砸了一点,但这就是我正在关注的论文所描述的内容。

标签: python r graph-theory igraph adjacency-matrix


【解决方案1】:

我不认为邻接矩阵是你所追求的。我想这应该是过渡的摘要信息。您可以尝试下面的基本 R 代码(没有 igraph

d <- do.call(
  rbind,
  apply(
    embed(seq_along(df), 2),
    1,
    function(k) {
      expand.grid(
        setNames(
          df[rev(k)],
          c("from", "to")
        )
      )
    }
  )
)
lvls <- sort(unique(unlist(d)))
table(list2DF(lapply(d, factor, level = lvls)))

这使

    to
from 1 2 3 5 22 23
  1  6 3 7 2  2  1
  2  1 2 2 0  0  1
  3  6 3 7 2  2  1
  5  2 1 2 1  0  0
  22 3 0 3 1  2  0
  23 0 0 0 0  0  0

数据

> dput(df)
structure(list(x1 = c(1L, 22L, 3L), x2 = c(1L, 22L, 3L), x3 = c(1L, 
22L, 3L), x4 = c(1L, 3L, 5L), x5 = c(1L, 3L, 5L), x6 = c(1L,
3L, 2L), x7 = 1:3, x8 = c(2L, 3L, 23L)), class = "data.frame", row.names = c(NA,
-3L))

【讨论】:

  • 你是对的。我对这篇文章对这部分算法的描述感到有点困惑。如果我想要一个真正的邻接矩阵(所以在图中,每个节点都是唯一的,但每个圆圈中的数字作为一个属性),我该如何处理编码?
【解决方案2】:

看来您可能误解了邻接矩阵的工作原理。

矩阵包含布尔值( true 或 false )

节点的索引应为 1,2,3,4, ...

如果从节点 1 到节点 2 存在链接,则第 2 行第 1 列中的单元格将为真。

让我们像这样索引你的前两列

1 4
2 5
3 6

所以节点 1 链接到节点 4,5 和 6

邻接矩阵看起来像这样

  1 2 3 4 5 6
1 
2 
3
4 1 1 1
5 1 1 1
6 1 1 1

【讨论】:

  • 我理解您的推理(可能有 0,1 和 2,对吗?)。在那种情况下,我需要构建一个如图所示的结构,节点属性等于数字显示的内容。
  • 邻接矩阵中的单元表示两个节点之间是否存在链接。因此该值可以是 false 或 true(== blank 或 1)。值 2 没有意义。
  • 是的是的忘记我在说什么(这是漫长的一天)。我的意思是对角线可以是非 0 的。
【解决方案3】:

你可以这样做:

as.data.frame.matrix(xtabs(~factor(x1, unique(c(x1, values)))+values, cbind(df[1], stack(df[-1]))))
   1 2 3 5 22 23
1  6 1 0 0  0  0
22 0 1 4 0  2  0
3  0 1 3 2  0  1
5  0 0 0 0  0  0
2  0 0 0 0  0  0
23 0 0 0 0  0  0


xtabs(~x1+x, transform(reshape(df, names(df)[-1], dir='long', sep=''), x1 = factor(x1, unique(c(x,x1)))))
    x
x1   1 2 3 5 22 23
  1  6 1 0 0  0  0
  22 0 1 4 0  2  0
  3  0 1 3 2  0  1
  5  0 0 0 0  0  0
  2  0 0 0 0  0  0
  23 0 0 0 0  0  0

library(tidyverse)
df %>%
   mutate(x1 = factor(x1, unique(unlist(.)))) %>%
   pivot_longer(-x1) %>%
   xtabs(~x1+value,.) %>%
   as.data.frame.matrix()

   1 2 3 5 22 23
1  6 1 0 0  0  0
22 0 1 4 0  2  0
3  0 1 3 2  0  1
5  0 0 0 0  0  0
2  0 0 0 0  0  0
23 0 0 0 0  0  0

【讨论】:

    【解决方案4】:

    @ThomasisCoding 的数据框开始。

      structure(list(x1 = c(1L, 22L, 3L), x2 = c(1L, 22L, 3L), x3 = c(1L, 
      22L, 3L), x4 = c(1L, 3L, 5L), x5 = c(1L, 3L, 5L), x6 = c(1L,
      3L, 2L), x7 = 1:3, x8 = c(2L, 3L, 23L)), class = "data.frame", row.names = c(NA,
      -3L))
    

    第一种选择是组合所有节点而不考虑时间 (x1, x2, ...)。

    m1 <- formatC(as.matrix(df), width = 2, format = "d", flag = "0")
    

    输出。

          x1   x2   x3   x4   x5   x6   x7   x8  
     [1,] "01" "01" "01" "01" "01" "01" "01" "02"
     [2,] "22" "22" "22" "03" "03" "03" "02" "03"
     [3,] "03" "03" "03" "05" "05" "02" "03" "23"
    

    备选方案 (II) 考虑了观察时间。

    m2 <- 
      rbind(
      c1=paste(m1[1,], names(df), sep="_"),
      c2=paste(m1[2,], names(df), sep="_"),
      c3=paste(m1[3,], names(df), sep="_")
      )
    

    输出。

      [,1]    [,2]    [,3]    [,4]    [,5]    [,6]    [,7]    [,8]   
    c1 "01_x1" "01_x2" "01_x3" "01_x4" "01_x5" "01_x6" "01_x7" "02_x8"
    c2 "22_x1" "22_x2" "22_x3" "03_x4" "03_x5" "03_x6" "02_x7" "03_x8"
    c3 "03_x1" "03_x2" "03_x3" "05_x4" "05_x5" "02_x6" "03_x7" "23_x8"
    

    对于 i = 1 到 7,Expand.grid() 将 x(i) 和 x(i+1) 处的所有出现组合在一起。 根据手头的情况选择 m1 或 m2。

    mc <- m1
    mmm <- c()
    for (i in seq(ncol(m1)-1) ) { 
      mmm <- rbind(mmm, expand.grid(x = mc[, i], y = mc[, i + 1])) 
    }
    g   <- graph_from_data_frame(mmm, directed=FALSE)
    g[]
    

    输出(一)。

    6 x 6 sparse Matrix of class "dgCMatrix"
       01 22 03 05 02 23
    01  6  2  7  2  3  1
    22  3  2  3  1  .  .
    03  6  2  7  2  3  1
    05  2  .  2  1  1  .
    02  1  .  2  .  2  1
    23  .  .  .  .  .  .
    

    输出(二)。

    24 x 24 sparse Matrix of class "dgCMatrix"
       [[ suppressing 24 column names ‘01_x1’, ‘22_x1’, ‘03_x1’ ... ]]
                                                         
    01_x1 . . . 1 1 1 . . . . . . . . . . . . . . . . . .
    22_x1 . . . 1 1 1 . . . . . . . . . . . . . . . . . .
    03_x1 . . . 1 1 1 . . . . . . . . . . . . . . . . . .
    01_x2 . . . . . . 1 1 1 . . . . . . . . . . . . . . .
    22_x2 . . . . . . 1 1 1 . . . . . . . . . . . . . . .
    03_x2 . . . . . . 1 1 1 . . . . . . . . . . . . . . .
    01_x3 . . . . . . . . . 1 1 1 . . . . . . . . . . . .
    22_x3 . . . . . . . . . 1 1 1 . . . . . . . . . . . .
    03_x3 . . . . . . . . . 1 1 1 . . . . . . . . . . . .
    01_x4 . . . . . . . . . . . . 1 1 1 . . . . . . . . .
    03_x4 . . . . . . . . . . . . 1 1 1 . . . . . . . . .
    05_x4 . . . . . . . . . . . . 1 1 1 . . . . . . . . .
    01_x5 . . . . . . . . . . . . . . . 1 1 1 . . . . . .
    03_x5 . . . . . . . . . . . . . . . 1 1 1 . . . . . .
    05_x5 . . . . . . . . . . . . . . . 1 1 1 . . . . . .
    01_x6 . . . . . . . . . . . . . . . . . . 1 1 1 . . .
    03_x6 . . . . . . . . . . . . . . . . . . 1 1 1 . . .
    02_x6 . . . . . . . . . . . . . . . . . . 1 1 1 . . .
    01_x7 . . . . . . . . . . . . . . . . . . . . . 1 1 1
    02_x7 . . . . . . . . . . . . . . . . . . . . . 1 1 1
    03_x7 . . . . . . . . . . . . . . . . . . . . . 1 1 1
    02_x8 . . . . . . . . . . . . . . . . . . . . . . . .
    03_x8 . . . . . . . . . . . . . . . . . . . . . . . .
    23_x8 . . . . . . . . . . . . . . . . . . . . . . . .
    

    【讨论】:

      猜你喜欢
      • 2023-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-11
      • 2021-05-18
      相关资源
      最近更新 更多