如何使用具有 NA 值的顶点属性对 igraph 对象(图)进行子图化 - R

how to subgraph an igraph object (graph) using vertices attribute that has NA values - R

我正在尝试通过基于顶点属性的值过滤顶点来使用 igraph in 对图进行子图化。属性值可以是 NA,我希望排除那些具有 NA 值的值。

这是我的图表

> require(igraph)
> graph <- make_ring(7)
> V(graph)$name <- c("A", "B", "C", "D", "E", "F", "G")
> V(graph)$att1 <- c(1,2,NA,1,2,3,NA)
> subgraph <- make_ego_graph(graph, order=1, c("A", "D", "F"))  # this works because i'm using the names of vertices but it's not what I want

我在这里要做的就是获取具有 att1==1 的顶点的名称,并使用它而不是子图。但这不起作用并给我以下错误

 > V(graph)[att1 == 1, na_ok = TRUE]$name  

    Error in if (is.numeric(v) && any(v < 0)) { :    missing value where
        TRUE/FALSE needed

如何获取 att1 == 1 的顶点的名称向量以将其传递给子图函数? 还是有另一种使用属性值进行子图化的方法? 我希望子图包含所有选定的顶点 (att1 == 1) 以及连接到这些顶点的顶点。

这是您要找的吗?

require(igraph)
graph <- make_ring(7)
V(graph)$name <- c("A", "B", "C", "D", "E", "F", "G")
V(graph)$att1 <- c(1,2,NA,1,2,3,NA)

V(graph)$name[which(V(graph)$att1 == 1)] 
#> [1] "A" "D"

最近我成为 tidygraph 包的粉丝,它是 igraph 的包装器,因此可以使用 dplyr 和其他 tidyverse 包来操作图表。在这种情况下:

library(tidygraph)
library(dplyr)

as_tbl_graph(graph) %>% 
  activate(nodes) %>% 
  filter(att1 == 1) %>% 
  pull(name)
#> [1] "A" "D"

或者直接对图进行子集化 (afaik)

graph_tidy <- as_tbl_graph(graph) %>% 
  activate(nodes) %>% 
  filter(att1 == 1)

graph_tidy
#> # A tbl_graph: 2 nodes and 0 edges
#> #
#> # An undirected simple graph with 2 components
#> #
#> # Node Data: 2 x 2 (active)
#>   name   att1
#>   <chr> <dbl>
#> 1 A         1
#> 2 D         1
#> #
#> # Edge Data: 0 x 2
#> # ... with 2 variables: from <int>, to <int>