R igraph edgelist to adjacency matrix 如何 trim 0 块?
R igraph edgelist to adjacency matrix How to trim 0 chunks?
我有一个包含 3 列的边缘列表,类似于 From、To、Weight,但它没有 row/column 个名称。
A1 B1 0.3
A1 B2 0.2
A1 B3 0.1
A2 B1 0.3
A2 B2 0.2
A2 B3 0.3
... ...
更多细节:第 1 列只有“Ax”,第 2 列只有“Bx”,它们是不同的类型。 Ax 内或 Bx 内永远不会有真正的交叉,例如永远不会有像
这样的行
A1 A3 0.2
此外,生成的邻接矩阵应该是完全正方形的,A 的数量与 B 的数量完全一样,并且每个 A 只映射到每个 B 一次,反之亦然。
关注其他 Whosebug 线程,我已经申请了
library(igraph)
gdf <- graph.data.frame(edgelist)
adj_mat <- get.adjacency(gdf, sparse = FALSE, attr='X3')
但是,此输出充满了 Ax-Ax 和 Bx-Bx 对,即
A1 A2 A3
A1 0 0 0
A2 0 0 0
A3 0 0 0
在继续之前(这也是我想要的结果,没有 0 的前导和尾随块)
... A1 A2 A3
B1 0.3 0.3 ...
B2 0.2 0.2 ...
B3 0.1 0.3 ...
后跟一大块带有 Bx-Bx 交叉的 0。
所以这个矩阵大约是它需要的 3 倍。
我在 R 中的实际 adj_mat 输出,以防有帮助:
query_0 query_1 query_2 query_3 query_4 query_5 query_6 query_7 reference_B reference_CD4_T
query_0 0 0 0 0 0 0 0 0 0.9211076 0.9357135
query_1 0 0 0 0 0 0 0 0 0.5982098 0.6531529
query_2 0 0 0 0 0 0 0 0 0.9414440 0.9163261
query_3 0 0 0 0 0 0 0 0 0.7776452 0.7595893
query_4 0 0 0 0 0 0 0 0 0.1742785 0.4535070
query_5 0 0 0 0 0 0 0 0 0.8929904 0.8692392
query_6 0 0 0 0 0 0 0 0 0.8727388 0.9143452
query_7 0 0 0 0 0 0 0 0 0.6672841 0.7709745
reference_B 0 0 0 0 0 0 0 0 0.0000000 0.0000000
reference_CD4_T 0 0 0 0 0 0 0 0 0.0000000 0.0000000
reference_CD8_T 0 0 0 0 0 0 0 0 0.0000000 0.0000000
reference_DC 0 0 0 0 0 0 0 0 0.0000000 0.0000000
reference_Mono 0 0 0 0 0 0 0 0 0.0000000 0.0000000
reference_NK 0 0 0 0 0 0 0 0 0.0000000 0.0000000
reference_other 0 0 0 0 0 0 0 0 0.0000000 0.0000000
reference_other_T 0 0 0 0 0 0 0 0 0.0000000 0.0000000
reference_CD8_T reference_DC reference_Mono reference_NK reference_other reference_other_T
query_0 0.9795670 0.9616339 0.2036382 0.9735171 0.9868448 0.9683900
query_1 0.9581395 0.9263749 0.8985018 0.8132070 0.7481512 0.9580464
query_2 0.4993608 0.3923397 0.9837582 0.9125077 0.9859413 0.9322740
query_3 0.9069418 0.8334141 0.9652273 0.1926747 0.9856065 0.9556887
query_4 0.9415359 0.8987213 0.9075660 0.7965302 0.9804007 0.9542930
query_5 0.3971887 0.5269301 0.9410492 0.9178430 0.9854246 0.6326137
query_6 0.9752365 0.9528309 0.9084781 0.9701409 0.9274201 0.9644051
query_7 0.9712323 0.9535511 0.9000940 0.9376305 0.8200538 0.9356329
reference_B 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
reference_CD4_T 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
reference_CD8_T 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
reference_DC 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
reference_Mono 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
reference_NK 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
reference_other 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
reference_other_T 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
在这种特殊情况下,我可以通过
得到我想要的结果
adj_mat<- adj_mat[, -c(1:8)]
adj_mat<- adj_mat[-c(9:16),]
但我希望找到更通用的东西。
我并不一定要使用 igraph
包,我愿意使用任何其他包从边缘列表转换为邻接矩阵,甚至只是魔术数据整理。
你可能需要xtabs
> xtabs(Weight ~ ., df)
To
From B1 B2 B3
A1 0.3 0.2 0.1
A2 0.3 0.2 0.3
或
> as.data.frame.matrix(xtabs(Weight ~ ., df))
B1 B2 B3
A1 0.3 0.2 0.1
A2 0.3 0.2 0.3
数据
> dput(df)
structure(list(From = c("A1", "A1", "A1", "A2", "A2", "A2"),
To = c("B1", "B2", "B3", "B1", "B2", "B3"), Weight = c(0.3,
0.2, 0.1, 0.3, 0.2, 0.3)), class = "data.frame", row.names = c(NA,
-6L))
我有一个包含 3 列的边缘列表,类似于 From、To、Weight,但它没有 row/column 个名称。
A1 B1 0.3
A1 B2 0.2
A1 B3 0.1
A2 B1 0.3
A2 B2 0.2
A2 B3 0.3
... ...
更多细节:第 1 列只有“Ax”,第 2 列只有“Bx”,它们是不同的类型。 Ax 内或 Bx 内永远不会有真正的交叉,例如永远不会有像
这样的行A1 A3 0.2
此外,生成的邻接矩阵应该是完全正方形的,A 的数量与 B 的数量完全一样,并且每个 A 只映射到每个 B 一次,反之亦然。
关注其他 Whosebug 线程,我已经申请了
library(igraph)
gdf <- graph.data.frame(edgelist)
adj_mat <- get.adjacency(gdf, sparse = FALSE, attr='X3')
但是,此输出充满了 Ax-Ax 和 Bx-Bx 对,即
A1 A2 A3
A1 0 0 0
A2 0 0 0
A3 0 0 0
在继续之前(这也是我想要的结果,没有 0 的前导和尾随块)
... A1 A2 A3
B1 0.3 0.3 ...
B2 0.2 0.2 ...
B3 0.1 0.3 ...
后跟一大块带有 Bx-Bx 交叉的 0。
所以这个矩阵大约是它需要的 3 倍。
我在 R 中的实际 adj_mat 输出,以防有帮助:
query_0 query_1 query_2 query_3 query_4 query_5 query_6 query_7 reference_B reference_CD4_T
query_0 0 0 0 0 0 0 0 0 0.9211076 0.9357135
query_1 0 0 0 0 0 0 0 0 0.5982098 0.6531529
query_2 0 0 0 0 0 0 0 0 0.9414440 0.9163261
query_3 0 0 0 0 0 0 0 0 0.7776452 0.7595893
query_4 0 0 0 0 0 0 0 0 0.1742785 0.4535070
query_5 0 0 0 0 0 0 0 0 0.8929904 0.8692392
query_6 0 0 0 0 0 0 0 0 0.8727388 0.9143452
query_7 0 0 0 0 0 0 0 0 0.6672841 0.7709745
reference_B 0 0 0 0 0 0 0 0 0.0000000 0.0000000
reference_CD4_T 0 0 0 0 0 0 0 0 0.0000000 0.0000000
reference_CD8_T 0 0 0 0 0 0 0 0 0.0000000 0.0000000
reference_DC 0 0 0 0 0 0 0 0 0.0000000 0.0000000
reference_Mono 0 0 0 0 0 0 0 0 0.0000000 0.0000000
reference_NK 0 0 0 0 0 0 0 0 0.0000000 0.0000000
reference_other 0 0 0 0 0 0 0 0 0.0000000 0.0000000
reference_other_T 0 0 0 0 0 0 0 0 0.0000000 0.0000000
reference_CD8_T reference_DC reference_Mono reference_NK reference_other reference_other_T
query_0 0.9795670 0.9616339 0.2036382 0.9735171 0.9868448 0.9683900
query_1 0.9581395 0.9263749 0.8985018 0.8132070 0.7481512 0.9580464
query_2 0.4993608 0.3923397 0.9837582 0.9125077 0.9859413 0.9322740
query_3 0.9069418 0.8334141 0.9652273 0.1926747 0.9856065 0.9556887
query_4 0.9415359 0.8987213 0.9075660 0.7965302 0.9804007 0.9542930
query_5 0.3971887 0.5269301 0.9410492 0.9178430 0.9854246 0.6326137
query_6 0.9752365 0.9528309 0.9084781 0.9701409 0.9274201 0.9644051
query_7 0.9712323 0.9535511 0.9000940 0.9376305 0.8200538 0.9356329
reference_B 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
reference_CD4_T 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
reference_CD8_T 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
reference_DC 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
reference_Mono 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
reference_NK 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
reference_other 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
reference_other_T 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
在这种特殊情况下,我可以通过
得到我想要的结果adj_mat<- adj_mat[, -c(1:8)]
adj_mat<- adj_mat[-c(9:16),]
但我希望找到更通用的东西。
我并不一定要使用 igraph
包,我愿意使用任何其他包从边缘列表转换为邻接矩阵,甚至只是魔术数据整理。
你可能需要xtabs
> xtabs(Weight ~ ., df)
To
From B1 B2 B3
A1 0.3 0.2 0.1
A2 0.3 0.2 0.3
或
> as.data.frame.matrix(xtabs(Weight ~ ., df))
B1 B2 B3
A1 0.3 0.2 0.1
A2 0.3 0.2 0.3
数据
> dput(df)
structure(list(From = c("A1", "A1", "A1", "A2", "A2", "A2"),
To = c("B1", "B2", "B3", "B1", "B2", "B3"), Weight = c(0.3,
0.2, 0.1, 0.3, 0.2, 0.3)), class = "data.frame", row.names = c(NA,
-6L))