В качестве шаблона того, как с помощью igraph добраться до желаемого результата, приведен код ниже:
library(igraph)
airline<-c(0,0,1,0,0,1)
city1<-c('a','a','a','b','b','c')
city2<-c('b','c','d','c','d','d')
desired_output<-c(0,1,1,0,0,1)
mktdf<-data.frame(airline, city1, city2, desired_output)
g <- graph_from_data_frame(mktdf[mktdf$airline==1, 2:3], # your actual
# connections,
directed = F, # I am assuming that
# connections are flights back
# AND FORTH
vertices = letters[1:4] # you need to
# provide the list
# of vertices if some
# cities are unconnected
)
plot(g)
![](https://i.imgur.com/ZbOBOCL.png)
Теперь мы получаем компоненты - в основном нарезать его в
подключенный бит и неподключенный узел. Я сделаю это
разложив его на два графика, но в зависимости от того, где
вы собираетесь с вашим анализом, вы можете захотеть
components()
функция вместо:
comps <- decompose(g, min.vertices = 1)
comps
#> [[1]]
#> IGRAPH 8dfe807 UN-- 3 2 --
#> + attr: name (v/c)
#> + edges from 8dfe807 (vertex names):
#> [1] a--d c--d
#>
#> [[2]]
#> IGRAPH 5bb31f9 UN-- 1 0 --
#> + attr: name (v/c)
#> + edges from 5bb31f9 (vertex names):
Теперь у нас есть два графика. Вы хотите индикатор, равный 1, если
city1 и city2 в вашем df находятся в одном компоненте, а в противном случае ноль:
as.numeric(mktdf$city1 %in% names(V(comps[[1]])) &
mktdf$city2 %in% names(V(comps[[1]])))
#> [1] 0 1 1 0 0 1
Ура, это желаемый результат.
В этом примере мы знали, какой именно компонент мы искали, грубо взглянув на него.
Если вы хотите найти этот компонент в списке
компоненты, вы можете проверить, какой компонент имеет
оригинальные края в нем
lapply(comps, function(x){all(E(g) %in% E(x))})
#> [[1]]
#> [1] TRUE
#>
#> [[2]]
#> [1] FALSE
Здесь мы видим, что первый подграф, который мы нашли, - это тот, который мы хотели (это может иметь значение, если у вас много и много компонентов. Другой подход - взять самый большой компонент).