具有图形和数据框的跨模块的节点链接

问题描述

我有一个图形对象(一个加权网络),其中节点属于数据帧中定义的不同模块化类。我想计算一个节点到所有不同模块(它自己的模块和每个其他模块)中的其他节点的链接数。

如何根据我的图形对象 g 和我的数据框 modules 编写此计算?。我的预期输出一个数据框,其中包含每个节点(国家/地区)到模块 1、模块 2、模块 3 等的链接。感谢任何帮助!

可重现的例子:

g <- structure(c(32,12,54,73,91,65.27657092,99,76,36.95395031,88,44,86.09277176,84,11,45,0),.Dim = c(6L,6L),.Dimnames = list(
                   c("Indonesia","Iran (Islamic Republic of)","Iraq","Ireland","Israel","Italy"),c("Indonesia","Iran..Islamic.Republic.of.","Italy")))                                                                                                                      

library(igraph)
g <- graph_from_adjacency_matrix(g)

modules <- structure(list(Label = structure(73:78,.Label = c("Afghanistan","Albania","Algeria","Angola","Antigua and Barbuda","Argentina","Armenia","Aruba","Australia","Austria","Azerbaijan","Bahrain","Bangladesh","Barbados","Belarus","Belgium","Belize","Benin","Bhutan","Bolivia (Plurinational State of)","Bosnia and Herzegovina","Botswana","Brazil","Brunei Darussalam","Bulgaria","Burkina Faso","Burundi","C?te d'Ivoire","Cambodia","Cameroon","Canada","Central African Republic","Chile","China","China,Hong Kong SAR",Macao SAR",Taiwan Province of","Colombia","Congo","Costa Rica","Croatia","Cuba","Cyprus","Czechia","Democratic People's Republic of Korea","Democratic Republic of the Congo","Denmark","Dominican Republic","Ecuador","Egypt","El Salvador","Eritrea","Estonia","Eswatini","Ethiopia","Finland","France","Gabon","Gambia","Georgia","Germany","Ghana","Greece","Grenada","Guatemala","Guinea","Guinea-Bissau","Guyana","Haiti","Honduras","Hungary","India","Indonesia","Italy","Jamaica","Japan","Jordan","Kazakhstan","Kenya","Kuwait","Kyrgyzstan","Lao People's Democratic Republic","Latvia","Lebanon","Lesotho","Liberia","Libya","Lithuania","Luxembourg","Madagascar","Malawi","Malaysia","Mali","Malta","Mauritania","Mexico","Mongolia","Montenegro","Morocco","Mozambique","Myanmar","Namibia","Nepal","Netherlands","New Zealand","Nicaragua","Niger","Nigeria","north Macedonia","norway","Oman","Pakistan","Palestine","Panama","Papua New Guinea","Paraguay","Peru","Philippines","Poland","Portugal","Qatar","Republic of Korea","Republic of Moldova","Romania","Russian Federation","Rwanda","Saint Kitts and Nevis","Saint Lucia","Saint vincent and the Grenadines","Saudi arabia","Senegal","Serbia","Sierra Leone","Singapore","Slovakia","Slovenia","Somalia","South Africa","Spain","Sri Lanka","Sudan","Suriname","Sweden","Switzerland","Syrian arab Republic","Tajikistan","Thailand","Timor-Leste","Trinidad and Tobago","Tunisia","Turkey","Turkmenistan","Uganda","Ukraine","United arab Emirates","United Kingdom of Great Britain and northern Ireland","United Republic of Tanzania","United States of America","Uruguay","Uzbekistan","Venezuela (Bolivarian Republic of)","Viet Nam","Yemen","Zambia","Zimbabwe"),class = "factor"),modularity_class = c(0L,3L,2L,1L,4L,4L)),row.names = c("Indonesia","Italy"
               ),class = "data.frame")

解决方法

更新 2

如果你想要有重复边的无向图,你可以试试这个代码

g <- graph_from_adjacency_matrix(+(df > 0),diag = FALSE) %>%
    as.undirected() %>%
    set_vertex_attr(
        name = "module",value = with(modules,modularity_class[match(names(V(.)),Label)])
    )

out <- sapply(V(g),function(x) {
    m <- neighbors(g,x)$module
    table(m[m != V(g)[x]$module])
})

这样

> out
$Indonesia

2 3
1 1

$Iran

0 1 2 4
1 1 1 1

$Iraq

0 1 3 4 
1 1 1 1

$Ireland

2 3 4
1 1 2

$Israel

1
1

$Italy

1 2 3
1 1 1

更新

如果要查看分布,可以使用table

sapply(V(g),x)$module
    table(m[m != V(g)[x]$module])
})

给出

$Indonesia

 2  3
99 73

$Iran

 0  1  2
12 88 76

$Iraq

 0  1  3
54 44 91

$Ireland

 4
84

$Israel
< table of extent 0 >

$Italy

 1  2  3
86 36 65

我们可以使用set_vertex_attrmodularity_class中用modules设置顶点属性

g <- g %>%
    set_vertex_attr(
        name = "module",Label)])
    )

然后我们找到每个顶点的 neighbors 并用具有不同模块等级的邻居的数量进行总结

out <- sapply(V(g),function(x) sum(neighbors(g,x)$module != V(g)[x]$module))[x]$module))

给出

> out
Indonesia      Iran      Iraq   Ireland    Israel     Italy 
      172       176       189        84         0       187

数据

df <- structure(c(
    32,12,54,73,91,65.27657092,99,76,36.95395031,88,44,86.09277176,84,11,45,0
),.Dim = c(6L,6L),.Dimnames = list(
    c(
        "Indonesia","Iran","Iraq","Ireland","Israel","Italy"
    ),c(
        "Indonesia","Italy"
    )
))

modules <- structure(list(
    Label = structure(73:78,.Label = c(
        "Afghanistan","Albania","Algeria","Angola","Antigua and Barbuda","Argentina","Armenia","Aruba","Australia","Austria","Azerbaijan","Bahrain","Bangladesh","Barbados","Belarus","Belgium","Belize","Benin","Bhutan","Bolivia (Plurinational State of)","Bosnia and Herzegovina","Botswana","Brazil","Brunei Darussalam","Bulgaria","Burkina Faso","Burundi","C?te d'Ivoire","Cambodia","Cameroon","Canada","Central African Republic","Chile","China","China,Hong Kong SAR",Macao SAR",Taiwan Province of","Colombia","Congo","Costa Rica","Croatia","Cuba","Cyprus","Czechia","Democratic People's Republic of Korea","Democratic Republic of the Congo","Denmark","Dominican Republic","Ecuador","Egypt","El Salvador","Eritrea","Estonia","Eswatini","Ethiopia","Finland","France","Gabon","Gambia","Georgia","Germany","Ghana","Greece","Grenada","Guatemala","Guinea","Guinea-Bissau","Guyana","Haiti","Honduras","Hungary","India","Indonesia","Italy","Jamaica","Japan","Jordan","Kazakhstan","Kenya","Kuwait","Kyrgyzstan","Lao People's Democratic Republic","Latvia","Lebanon","Lesotho","Liberia","Libya","Lithuania","Luxembourg","Madagascar","Malawi","Malaysia","Mali","Malta","Mauritania","Mexico","Mongolia","Montenegro","Morocco","Mozambique","Myanmar","Namibia","Nepal","Netherlands","New Zealand","Nicaragua","Niger","Nigeria","North Macedonia","Norway","Oman","Pakistan","Palestine","Panama","Papua New Guinea","Paraguay","Peru","Philippines","Poland","Portugal","Qatar","Republic of Korea","Republic of Moldova","Romania","Russian Federation","Rwanda","Saint Kitts and Nevis","Saint Lucia","Saint Vincent and the Grenadines","Saudi Arabia","Senegal","Serbia","Sierra Leone","Singapore","Slovakia","Slovenia","Somalia","South Africa","Spain","Sri Lanka","Sudan","Suriname","Sweden","Switzerland","Syrian Arab Republic","Tajikistan","Thailand","Timor-Leste","Trinidad and Tobago","Tunisia","Turkey","Turkmenistan","Uganda","Ukraine","United Arab Emirates","United Kingdom of Great Britain and Northern Ireland","United Republic of Tanzania","United States of America","Uruguay","Uzbekistan","Venezuela (Bolivarian Republic of)","Viet Nam","Yemen","Zambia","Zimbabwe"
    ),class = "factor"),modularity_class = c(0L,3L,2L,1L,4L,4L)
),row.names = c(
    "Indonesia","Italy"
),class = "data.frame")