rigraph lapply:计算更大网络中自我网络的密度、约束或其他度量
r igraph lapply: Compute density, constraint or other measures for ego networks in a larger network
我有一个包含数千个节点的网络数据集,这些节点形成了一个完整的网络,其中包含孤立的、不同的子图和几个不同的组件。
我想计算结构网络度量,例如每个节点的自我网络的密度和约束(即,直接邻居,但也与距离为 2 的间接邻居有联系)。
我找到了适用于密度的解决方案:
library(igraph)
g<- graph.formula(1-+2,1-+3,2-+4,2-+5,3-+6,5-+7,7-+8,8-+9,9+-7, 9-+10,
6-+9,1-+5,3-+9,10-+11,11-+12,11-+5,12-+4,4-+10,10-+4,11-+10)
# Density for ego graphs
ego_1_graph <- make_ego_graph(
g,
order = 1,
nodes = V(g),
mode = c("all"),
mindist = 0
)
V(g)$ego_1a_dens = lapply(ego_1_graph, graph.density) ## this works
V(g)$ego_1a_dens
V(g)$ego_1b_dens = lapply(ego_1_graph, edge_density(loops= FALSE) ) ## this needs a graph specified
## Error in is_igraph(graph) : argument "graph" is missing, with no default
V(g)$ego_1b_dens = lapply(ego_1_graph, function(v) edge_density(ego_1_graph[v], loops= FALSE) ) ## I cannot access the graph saved in the ego_1_graph list
## Error in ego_1_graph[v] : invalid subscript type 'list'
链接的解决方案使用 graph.density 而不是 edge.density。我还没有找到前一个函数的 igraph 文档。后者允许像 loop=FALSE 这样的选项,但必须明确指定图形:graph.density(g,loop=FALSE)。因为我想使用选项计算自我网络的其他结构网络度量(例如,约束),所以我真的很想使用文档中的函数。
我很难使用 lapply 函数访问为每个网络节点构建的自我图。我希望你能帮忙!谢谢!
顺便说一句:
我有一个大型网络,因此计算效率很重要。我知道应用函数已经矢量化了。通过阅读 Whosebug,我可以收集到,igraph 的 make_ego_graph 函数可能是一个潜在的瓶颈。我找到了通过数据帧构建直接邻居自我网络的解决方案 FAST way to sum up neighbors' attributes in a large graph in R 但我如何使用距离为 2 或更远的自我网络来做到这一点?
像这样lapply
试试
V(g)$ego_1b_dens <- lapply(ego_1_graph, edge_density, loops = FALSE)
你会看到
> V(g)$ego_1b_dens
[[1]]
[1] 0.3333333
[[2]]
[1] 0.3333333
[[3]]
[1] 0.3333333
[[4]]
[1] 0.3333333
[[5]]
[1] 0.25
[[6]]
[1] 0.5
[[7]]
[1] 0.3333333
[[8]]
[1] 0.5
[[9]]
[1] 0.2333333
[[10]]
[1] 0.4166667
[[11]]
[1] 0.3333333
[[12]]
[1] 0.3333333
我有一个包含数千个节点的网络数据集,这些节点形成了一个完整的网络,其中包含孤立的、不同的子图和几个不同的组件。 我想计算结构网络度量,例如每个节点的自我网络的密度和约束(即,直接邻居,但也与距离为 2 的间接邻居有联系)。
我找到了适用于密度的解决方案:
library(igraph)
g<- graph.formula(1-+2,1-+3,2-+4,2-+5,3-+6,5-+7,7-+8,8-+9,9+-7, 9-+10,
6-+9,1-+5,3-+9,10-+11,11-+12,11-+5,12-+4,4-+10,10-+4,11-+10)
# Density for ego graphs
ego_1_graph <- make_ego_graph(
g,
order = 1,
nodes = V(g),
mode = c("all"),
mindist = 0
)
V(g)$ego_1a_dens = lapply(ego_1_graph, graph.density) ## this works
V(g)$ego_1a_dens
V(g)$ego_1b_dens = lapply(ego_1_graph, edge_density(loops= FALSE) ) ## this needs a graph specified
## Error in is_igraph(graph) : argument "graph" is missing, with no default
V(g)$ego_1b_dens = lapply(ego_1_graph, function(v) edge_density(ego_1_graph[v], loops= FALSE) ) ## I cannot access the graph saved in the ego_1_graph list
## Error in ego_1_graph[v] : invalid subscript type 'list'
链接的解决方案使用 graph.density 而不是 edge.density。我还没有找到前一个函数的 igraph 文档。后者允许像 loop=FALSE 这样的选项,但必须明确指定图形:graph.density(g,loop=FALSE)。因为我想使用选项计算自我网络的其他结构网络度量(例如,约束),所以我真的很想使用文档中的函数。
我很难使用 lapply 函数访问为每个网络节点构建的自我图。我希望你能帮忙!谢谢!
顺便说一句: 我有一个大型网络,因此计算效率很重要。我知道应用函数已经矢量化了。通过阅读 Whosebug,我可以收集到,igraph 的 make_ego_graph 函数可能是一个潜在的瓶颈。我找到了通过数据帧构建直接邻居自我网络的解决方案 FAST way to sum up neighbors' attributes in a large graph in R 但我如何使用距离为 2 或更远的自我网络来做到这一点?
像这样lapply
试试
V(g)$ego_1b_dens <- lapply(ego_1_graph, edge_density, loops = FALSE)
你会看到
> V(g)$ego_1b_dens
[[1]]
[1] 0.3333333
[[2]]
[1] 0.3333333
[[3]]
[1] 0.3333333
[[4]]
[1] 0.3333333
[[5]]
[1] 0.25
[[6]]
[1] 0.5
[[7]]
[1] 0.3333333
[[8]]
[1] 0.5
[[9]]
[1] 0.2333333
[[10]]
[1] 0.4166667
[[11]]
[1] 0.3333333
[[12]]
[1] 0.3333333