将顶点(“类型”)参数添加到 igraph 对象列表

问题描述 投票:0回答:2

我有一个列表列表,其中包含植物-传粉者相互作用的边缘列表,用于许多二分网络。使用

igraph
r-package 我试图将这些列表转换为二分关联矩阵进行分析。

我无法将顶点(

igraph::V
)添加到列表中的 igraph 对象
graph_list
。注意:我宁愿避免
for
循环解决方案,因为我的完整数据集是包含 >80k 边的 238 个网络的列表。

我的数据的可重现示例。

network_list <- replicate(10, expr = {data.frame(plant = paste('plnt', '_', sample(x = letters, size = 10,  replace = T), sep = ""),pollinator = paste('pollinator', '_', sample(x = letters, size = 10,  replace = T), sep = ""))}, simplify = F)


library(tidyverse)  
library(dplyr)  
library(igraph)

我正在尝试将顶点序列添加到列表中的每个图形。但是下面的代码并没有像我期望的那样工作。

graph_list <- lapply(network_list, graph_from_data_frame) #creates list of igraph objects from list of edgelists   
list_mapping <- lapply(graph_list, bipartite.mapping) #map networks as bipartit   
list_type<- lapply(list_mapping, with, type) #extract list of vertices for each network  
graph_list <- mapply(c, graph_list, list_type) #ATTEMPT to add vertices to graph_list
incidence_list <- lapply(graph_list, get.incidence) #breaks


`Error in FUN(X[[i]], ...) : Not a graph object

get.incidence
期望提供类型参数的二分
graph
对象。

作为参考,我正在遵循适用于单个网络的代码。

example_network <- network_list[[1]] #select one network for example  
net_graph <- graph_from_data_frame(example_network) #take the edge list and make it into a graph  
bipartite.mapping(net_graph) #make bipartite graph       

OUTPUT:
$res
[1] TRUE
$type
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE

V(net_graph)$type <- bipartite.mapping(net_graph)$type #compute vertices ('type') and add as vector to graph   
incidence_matrix <- get.incidence(net_graph) #produce incidence matrix  
incidence_matrix[incidence_matrix > 1] <- 1 #force 0/1 edge, some rows are duplicated in random list resulting in values >1

我想要的列表中每个关联矩阵的格式是:

 poll_z poll_g poll_h poll_d poll_r poll_i poll_l poll_x
plnt_v 1 0 0 0 0 0 0 0
plnt_o 0 1 0 0 0 0 0 0
plnt_r 0 0 1 0 1 0 0 0
plnt_c 0 0 0 1 0 0 0 0
plnt_x 0 0 0 1 0 0 0 0
plnt_a 0 0 0 0 0 1 1 0
plnt_j 0 0 0 0 0 0 1 0
plnt_h 0 0 0 0 0 0 0 1

此外,将矩阵列表中所有可能的重复值(即值 >1)强制等于 1 也会有很大帮助。

r list performance igraph bipartite
2个回答
0
投票

mapply
使用
c
的电话是不正确的。您可以直接在
function(g, type) { V(g)$type <- type; return(g) }
中编写自己的小 lambda 函数,例如
mapply
,尽管还有 igraph 函数
vertex_attr<-
可以直接做同样的事情。

我倾向于使用

Map
而不是
mapply
,因为它本质上是相同的功能,但从不尝试像
mapply
那样“简化”输出,这可能会导致意想不到的结果。 (
Map(...)
mapply(..., SIMPLIFY = FALSE)
相同,但需要更少的击键)。

最后,要转换矩阵列表,使 0 保留为 0,所有正数变为 1,我们可以这样做

lapply(incidence_list, sign)

所以你的整个代码可能是这样的:

library(tidyverse)  
library(igraph)

graph_list     <- lapply(network_list, graph_from_data_frame)
list_mapping   <- lapply(graph_list, bipartite.mapping) 
list_type      <- lapply(list_mapping, with, type) 
graph_list     <- Map(`vertex_attr<-`, graph_list, "type", value = list_type) 
incidence_list <- lapply(graph_list, get.incidence) 
incidence_list <- lapply(incidence_list, sign)

你的结果是:

incidence_list
#> [[1]]
#>        pollinator_z pollinator_h pollinator_a pollinator_c pollinator_x
#> plnt_m            1            0            0            0            0
#> plnt_k            0            1            1            0            1
#> plnt_l            0            0            0            1            0
#> plnt_c            0            0            0            0            0
#> plnt_y            0            0            0            0            0
#> plnt_u            1            0            0            0            0
#>        pollinator_b pollinator_n pollinator_l pollinator_i
#> plnt_m            0            0            1            1
#> plnt_k            0            0            0            0
#> plnt_l            0            0            0            0
#> plnt_c            1            0            0            0
#> plnt_y            0            1            0            0
#> plnt_u            0            0            0            0
#> 
#> [[2]]
#>        pollinator_j pollinator_t pollinator_o pollinator_s pollinator_l
#> plnt_e            1            0            0            0            0
#> plnt_t            0            1            0            0            0
#> plnt_j            0            0            1            0            0
#> plnt_v            0            0            0            1            0
#> plnt_o            0            0            1            0            1
#> plnt_p            0            0            0            0            0
#> plnt_b            0            0            0            0            0
#> plnt_u            0            0            0            0            0
#>        pollinator_c pollinator_r pollinator_f
#> plnt_e            0            1            0
#> plnt_t            0            0            0
#> plnt_j            0            0            0
#> plnt_v            0            0            0
#> plnt_o            0            0            0
#> plnt_p            1            0            0
#> plnt_b            0            1            0
#> plnt_u            0            0            1
#> 
#> [[3]]
#>        pollinator_k pollinator_u pollinator_x pollinator_g pollinator_o
#> plnt_a            1            0            0            0            0
#> plnt_e            0            1            0            0            0
#> plnt_u            0            0            1            0            0
#> plnt_w            0            0            0            1            0
#> plnt_i            0            0            0            0            1
#> plnt_d            0            0            0            0            0
#> plnt_r            0            0            0            0            0
#> plnt_h            0            0            0            0            0
#>        pollinator_s pollinator_e pollinator_h
#> plnt_a            0            0            1
#> plnt_e            0            0            0
#> plnt_u            0            0            0
#> plnt_w            0            0            0
#> plnt_i            0            0            0
#> plnt_d            1            0            0
#> plnt_r            0            1            0
#> plnt_h            1            0            0
#> 
#> [[4]]
#>        pollinator_r pollinator_i pollinator_l pollinator_m pollinator_z
#> plnt_n            1            0            0            0            0
#> plnt_d            0            1            0            0            0
#> plnt_g            0            0            1            0            0
#> plnt_v            0            0            0            1            0
#> plnt_y            0            0            0            0            1
#> plnt_l            0            0            0            0            0
#> plnt_r            0            0            0            0            0
#> plnt_j            0            0            0            0            0
#>        pollinator_k pollinator_o pollinator_c pollinator_j pollinator_x
#> plnt_n            0            0            0            0            0
#> plnt_d            0            0            0            0            0
#> plnt_g            0            0            0            0            0
#> plnt_v            0            0            1            0            0
#> plnt_y            0            0            0            0            0
#> plnt_l            1            0            0            0            1
#> plnt_r            0            1            0            0            0
#> plnt_j            0            0            0            1            0
#> 
#> [[5]]
#>        pollinator_l pollinator_p pollinator_f pollinator_x pollinator_m
#> plnt_m            1            0            0            1            0
#> plnt_i            0            1            0            0            0
#> plnt_x            0            0            1            0            0
#> plnt_k            0            0            0            0            1
#> plnt_l            0            0            0            0            0
#> plnt_z            0            0            0            0            0
#>        pollinator_u pollinator_e pollinator_r pollinator_b pollinator_a
#> plnt_m            0            0            0            0            0
#> plnt_i            0            0            1            0            1
#> plnt_x            1            0            0            0            0
#> plnt_k            0            0            0            0            0
#> plnt_l            0            1            0            0            0
#> plnt_z            0            0            0            1            0
#> 
#> [[6]]
#>        pollinator_d pollinator_x pollinator_n pollinator_y pollinator_s
#> plnt_k            1            0            0            0            0
#> plnt_b            0            1            0            0            0
#> plnt_m            0            0            1            0            0
#> plnt_g            0            0            0            1            0
#> plnt_z            0            0            0            0            1
#> plnt_j            0            0            0            0            0
#> plnt_x            0            0            0            0            0
#> plnt_v            0            0            0            0            0
#>        pollinator_k pollinator_i pollinator_c
#> plnt_k            0            0            0
#> plnt_b            0            0            0
#> plnt_m            1            0            0
#> plnt_g            0            0            0
#> plnt_z            0            0            0
#> plnt_j            1            0            0
#> plnt_x            0            1            0
#> plnt_v            0            0            1
#> 
#> [[7]]
#>        pollinator_r pollinator_x pollinator_k pollinator_j pollinator_u
#> plnt_q            1            0            0            0            0
#> plnt_o            0            1            0            0            0
#> plnt_z            0            0            1            0            0
#> plnt_t            0            1            0            0            0
#> plnt_g            0            0            0            1            0
#> plnt_e            0            0            0            0            1
#> plnt_p            0            0            0            0            1
#> plnt_r            0            0            0            0            0
#> plnt_n            0            0            0            0            0
#>        pollinator_a pollinator_s pollinator_d
#> plnt_q            0            0            0
#> plnt_o            0            0            1
#> plnt_z            0            0            0
#> plnt_t            0            0            0
#> plnt_g            0            0            0
#> plnt_e            0            0            0
#> plnt_p            0            0            0
#> plnt_r            1            0            0
#> plnt_n            0            1            0
#> 
#> [[8]]
#>        pollinator_g pollinator_b pollinator_m pollinator_v pollinator_c
#> plnt_w            1            0            0            1            0
#> plnt_l            0            1            0            0            0
#> plnt_s            0            0            1            0            0
#> plnt_c            0            0            0            1            0
#> plnt_p            0            0            0            0            1
#> plnt_x            0            0            0            0            0
#> plnt_d            0            0            0            0            0
#> plnt_r            0            0            0            0            0
#>        pollinator_o pollinator_z pollinator_t pollinator_j
#> plnt_w            0            0            0            0
#> plnt_l            0            0            0            0
#> plnt_s            0            0            0            0
#> plnt_c            0            0            0            1
#> plnt_p            0            0            0            0
#> plnt_x            1            0            0            0
#> plnt_d            0            1            0            0
#> plnt_r            0            0            1            0
#> 
#> [[9]]
#>        pollinator_g pollinator_x pollinator_f pollinator_v pollinator_q
#> plnt_t            1            0            0            0            0
#> plnt_k            0            1            0            0            0
#> plnt_l            0            0            1            0            0
#> plnt_r            0            0            0            1            0
#> plnt_b            0            0            0            0            1
#> plnt_s            0            0            0            0            0
#> plnt_m            0            0            0            0            0
#> plnt_n            0            0            1            0            0
#> plnt_g            0            0            0            0            0
#>        pollinator_z pollinator_e pollinator_n pollinator_w
#> plnt_t            0            0            0            0
#> plnt_k            0            0            0            0
#> plnt_l            1            0            0            0
#> plnt_r            0            0            0            0
#> plnt_b            0            0            0            0
#> plnt_s            0            1            0            0
#> plnt_m            0            0            1            0
#> plnt_n            0            0            0            0
#> plnt_g            0            0            0            1
#> 
#> [[10]]
#>        pollinator_i pollinator_q pollinator_g pollinator_b pollinator_p
#> plnt_p            1            0            0            0            0
#> plnt_h            0            1            0            0            0
#> plnt_y            0            0            1            0            0
#> plnt_s            0            0            0            1            0
#> plnt_z            0            0            0            0            1
#> plnt_j            0            0            0            0            0
#> plnt_e            0            0            0            0            0
#> plnt_m            0            0            0            0            0
#> plnt_x            0            0            0            0            0
#>        pollinator_o pollinator_z pollinator_a pollinator_y pollinator_h
#> plnt_p            0            0            0            0            0
#> plnt_h            0            0            0            0            0
#> plnt_y            0            0            0            0            0
#> plnt_s            0            0            0            0            0
#> plnt_z            0            0            0            0            0
#> plnt_j            1            1            0            0            0
#> plnt_e            0            0            1            0            0
#> plnt_m            0            0            0            1            0
#> plnt_x            0            0            0            0            1

创建于 2023-02-19 与 reprex v2.0.2


0
投票

使用 for 循环避免 igraph。

## from question
set.seed(75498353)
n <- 10 # size of plant, pollinator.
network_list <- replicate(2, expr = {
  data.frame( plant      = paste('plnt', '_', sample(x = letters, size = n,  replace = TRUE), sep = ""),
              pollinator = paste('pollinator', '_', sample(x = letters, size = n,  replace = TRUE), sep = "")
            )
  }, simplify = FALSE)

## create list of incidence matrices
incidence_list <- list()
for (el in network_list){
  incidence_list[length(incidence_list) + 1] <- list(table(el)) # append next incidence matrix
}

这取代了 for 循环。慢,包括复制。

incidence_list <- lapply(network_list, function(x) { rbind(incidence_list, table(x)) })
© www.soinside.com 2019 - 2024. All rights reserved.