识别并量化igraph中的簇类型

识别并量化igraph中的簇类型,r,igraph,R,Igraph,我有以下图表: 这是根据给定的数据得出的: K01 <- cbind(c(1, 3, 4, 6, 7, 8, 9, 11, 13, 14), c(2, 4, 5, 7, 8, 6, 10, 12, 14, 15)) K02 <- graph_from_edgelist(K01, directed = FALSE) K01我不完全确定,但似乎只要没有,如果一组中的边数等于或大于顶点数,它就是圆形的 with(do.call(rbind, lapply(K04, f

我有以下图表:

这是根据给定的数据得出的:

K01 <- cbind(c(1, 3, 4, 6, 7, 8, 9, 11, 13, 14),
         c(2, 4, 5, 7, 8, 6, 10, 12, 14, 15))
K02 <- graph_from_edgelist(K01, directed = FALSE)

K01我不完全确定,但似乎只要没有,如果一组中的边数等于或大于顶点数,它就是圆形的

with(do.call(rbind, lapply(K04, function(x){
    g = induced_subgraph(K02, x)
    data.frame(n = vcount(g),
               type = ifelse(ecount(g) >= vcount(g), "circular", "simple"))
})), table(n, type))
#   type
#n   simple circular
#  2      3        0
#  3      2        1

我不完全确定,但似乎只要没有,如果一组边的数量等于或大于顶点的数量,它就是圆形的

with(do.call(rbind, lapply(K04, function(x){
    g = induced_subgraph(K02, x)
    data.frame(n = vcount(g),
               type = ifelse(ecount(g) >= vcount(g), "circular", "simple"))
})), table(n, type))
#   type
#n   simple circular
#  2      3        0
#  3      2        1

所以,感谢d.b.在这方面的帮助。我分解并编写了一个函数,我认为它执行了我试图完成的任务。它有点冗长,可能很笨重,但它似乎符合我的需要

######
# take an igraph graph
# and return a nested list the length of the number of unique cluster structures
# where each list item is a list of clusters that shared that structure
# names ?
######

CategorizeSubGraphs <- function(IGraph) {

  cat("\n")
  # get groups
  IGroups <- groups(components(IGraph))

  Structures <- vector("list",
                       length = length(IGroups))
  StructNames <- vector("list",
                        length = length(IGroups))
  AllSubGraphs <- vector("list",
                         length = length(IGroups))

  # initialize a progress bar
  pBar <- txtProgressBar(style = 1L)

  # Get all graph structures, remove names for unique()
  for (i in seq_along(Structures)) {
    AllSubGraphs[[i]] <- induced_subgraph(graph = IGraph,
                                         vids = IGroups[[i]])
    Structures[[i]] <- AllSubGraphs[[i]][seq(length(AllSubGraphs[[i]][1]))]
    StructNames[[i]] <- dimnames(Structures[[i]])[[1]]
    dimnames(Structures[[i]]) <- list(NULL,
                                      NULL)
    setTxtProgressBar(pb = pBar,
                      value = i / length(Structures))
  }
  cat("\n")
  # categorize by structure
  GraphSizes <- sapply(unique(Structures),
                       function(x) nrow(x))
  AllSizes <- sapply(Structures,
                     function(x) nrow(x))
  GraphTemplates <- unique(Structures)

  Result <- vector("list",
                   length = length(GraphTemplates))
  StructureCategory <- vector("integer",
                              length = length(AllSizes))
  # assign each subgraph to a category
  for (i in seq_along(StructureCategory)) {
    Catch <- which(GraphSizes == AllSizes[i])
    if (length(Catch) == 1L) {
      StructureCategory[i] <- Catch
    } else {
      for (j in seq_along(Catch)) {
        if (all(GraphTemplates[[Catch[j]]] == Structures[[i]])) {
          StructureCategory[i] <- Catch[j]
        }
      }
    }
    setTxtProgressBar(pb = pBar,
                      value = i / length(StructureCategory))
  }

  Count <- rep(0L,
               length(Result))

  ResultSizes <- sapply(unique(StructureCategory),
                        function(x) length(which(StructureCategory == x)))

  for (i in seq_along(Result)) {
    Result[[i]] <- vector("list",
                          length = ResultSizes[i])
  }

  # collect all subgraphs into their distinct categories

  for (i in seq_along(StructureCategory)) {
    Count[StructureCategory[i]] <- Count[StructureCategory[i]] + 1L
    Result[[StructureCategory[i]]][[Count[StructureCategory[i]]]] <- AllSubGraphs[[i]]
  }
  cat("\n")
  return(Result)
}
######
#拿一张igraph图
#并返回一个嵌套列表,该列表的长度为唯一集群结构的数量
#其中,每个列表项都是共享该结构的集群列表
#名字?
######

分类子图所以,感谢d.b在这方面的帮助。我分解并编写了一个函数,我认为它执行了我试图完成的任务。它有点冗长,可能很笨重,但它似乎符合我的需要

######
# take an igraph graph
# and return a nested list the length of the number of unique cluster structures
# where each list item is a list of clusters that shared that structure
# names ?
######

CategorizeSubGraphs <- function(IGraph) {

  cat("\n")
  # get groups
  IGroups <- groups(components(IGraph))

  Structures <- vector("list",
                       length = length(IGroups))
  StructNames <- vector("list",
                        length = length(IGroups))
  AllSubGraphs <- vector("list",
                         length = length(IGroups))

  # initialize a progress bar
  pBar <- txtProgressBar(style = 1L)

  # Get all graph structures, remove names for unique()
  for (i in seq_along(Structures)) {
    AllSubGraphs[[i]] <- induced_subgraph(graph = IGraph,
                                         vids = IGroups[[i]])
    Structures[[i]] <- AllSubGraphs[[i]][seq(length(AllSubGraphs[[i]][1]))]
    StructNames[[i]] <- dimnames(Structures[[i]])[[1]]
    dimnames(Structures[[i]]) <- list(NULL,
                                      NULL)
    setTxtProgressBar(pb = pBar,
                      value = i / length(Structures))
  }
  cat("\n")
  # categorize by structure
  GraphSizes <- sapply(unique(Structures),
                       function(x) nrow(x))
  AllSizes <- sapply(Structures,
                     function(x) nrow(x))
  GraphTemplates <- unique(Structures)

  Result <- vector("list",
                   length = length(GraphTemplates))
  StructureCategory <- vector("integer",
                              length = length(AllSizes))
  # assign each subgraph to a category
  for (i in seq_along(StructureCategory)) {
    Catch <- which(GraphSizes == AllSizes[i])
    if (length(Catch) == 1L) {
      StructureCategory[i] <- Catch
    } else {
      for (j in seq_along(Catch)) {
        if (all(GraphTemplates[[Catch[j]]] == Structures[[i]])) {
          StructureCategory[i] <- Catch[j]
        }
      }
    }
    setTxtProgressBar(pb = pBar,
                      value = i / length(StructureCategory))
  }

  Count <- rep(0L,
               length(Result))

  ResultSizes <- sapply(unique(StructureCategory),
                        function(x) length(which(StructureCategory == x)))

  for (i in seq_along(Result)) {
    Result[[i]] <- vector("list",
                          length = ResultSizes[i])
  }

  # collect all subgraphs into their distinct categories

  for (i in seq_along(StructureCategory)) {
    Count[StructureCategory[i]] <- Count[StructureCategory[i]] + 1L
    Result[[StructureCategory[i]]][[Count[StructureCategory[i]]]] <- AllSubGraphs[[i]]
  }
  cat("\n")
  return(Result)
}
######
#拿一张igraph图
#并返回一个嵌套列表,该列表的长度为唯一集群结构的数量
#其中,每个列表项都是共享该结构的集群列表
#名字?
######

CategorizeSubGraphs@d.b只返回图中的组数?我在寻找一些东西来帮助我辨别,即使有3个大小为3的群集,也有两种不同的群集结构。@d.b抱歉,我用长度代替了长度,但问题仍然是一样的,我已经可以得到每个群集包含的节点数。@d.b这只返回图中的组数?我在寻找一些东西来帮助我辨别,即使有3个大小为3的群集,也有两种不同的群集结构。@d.b抱歉,我用长度代替了长度,但问题仍然是一样的,我已经可以得到每个群集包含的节点数。
K03 <- CategorizeSubGraphs(IGraph = K02)
length(K03) # the number of distinct subgraph types
[1] 5
lengths(K03) # the number of individual subgraphs for each type
[1] 3 2 1 1 1