[英]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.