как подграфировать объект (граф) igraph, используя атрибут vertices, который имеет значения NA - R - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь поставить подграф графа с помощью igraph, отфильтровывая вершины по значению атрибута вершин. значения атрибута могут быть 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) И вершины, которые соединяются с этими вершинами.

1 Ответ

1 голос
/ 24 октября 2019

Это то, что вы ищете?

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>
...