繁体   English   中英

从具有多列的 dataframe 创建有向邻接矩阵

[英]Creating a directed adjacency matrix from a dataframe with many columns

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

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应该 go 到 x2 列的 3 行,

22应该 go 到 x2 列的 3 行,

3应该 go 到 x2 列的 3 行

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

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

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

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

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

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

您似乎误解了邻接矩阵的工作原理。

矩阵包含布尔值( 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

我不认为邻接矩阵是你所追求的。 我想它应该是转换的摘要信息。 您可以尝试下面的基本 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))

你可以这样做:

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

从@ThomasisCoding 的@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")

Output。

      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="_")
  )

Output。

  [,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])) 
}
table(mmm)
g   <- graph_from_data_frame(mmm, directed=FALSE)
plot(g)
g[]

Output(一)。 table(mmm)检查这个 output 。

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  .  .  .  .  .  .

Output(二)。

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 . . . . . . . . . . . . . . . . . . . . . . . .

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM