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

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


person Ankhnesmerira    schedule 24.10.2019    source источник


Ответы (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"

Или напрямую подмножить график (афаик)

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>
person JBGruber    schedule 24.10.2019
comment
tidygraph кажется очень полезным. Спасибо, что поделился! - person Ankhnesmerira; 25.10.2019
comment
@JBGruber, можно ли построить график graph_tidy с помощью функции plot() пакета igrapgh? или его нужно преобразовать в igrapgh object? - person Alex; 16.02.2021
comment
Класс igraph сохраняется как запасной вариант. Так что да, вы можете просто использовать plot(). Я бы порекомендовал заглянуть в сопутствующий пакет от того же автора для построения графика: ggraph - person JBGruber; 17.02.2021
comment
@JBGruber, спасибо. Могу ли я добавить другие характеристики, такие как order=2 узлов или degree>0, следуя методологии вашего кода? - person Alex; 17.02.2021
comment
Вы можете использовать все глаголы dplyr для управления узлами или ребрами data.frame. - person JBGruber; 18.02.2021
comment
@JBGruber, спасибо, мне нужно найти непосредственных соседей (order=1) некоторых узлов. И (order=1) не находится в кадрах данных узлов или краев. Можно ли как-то использовать dplyr и tidygrapgh для отображения непосредственных соседей определенных узлов? - person Alex; 24.02.2021