Разъяснение по igraph :: count_multiple () - PullRequest
0 голосов
/ 25 августа 2018

Я ожидаю, что igraph::count_multiple() посчитает кратность ребер, что, похоже, отражает документация.Однако, это не всегда приводит к целым числам.

Пример:

library(igraph)
library(dplyr)

data("USairports", package = "igraphdata")

Ожидание: подсчет ребер при группировке по соответствующим вершинам ...

(
manualish_count <- USairports %>% 
  igraph::as_data_frame() %>% 
  add_count(from, to)
) %>% 
  select(from, to, n)

#> # A tibble: 23,473 x 3
#>    from  to        n
#>    <chr> <chr> <int>
#>  1 BGR   JFK       2
#>  2 BGR   JFK       2
#>  3 BOS   EWR      10
#>  4 ANC   JFK       1
#>  5 JFK   ANC       1
#>  6 LAS   LAX      20
#>  7 MIA   JFK      10
#>  8 EWR   ANC       1
#>  9 BJC   MIA       1
#> 10 MIA   BJC       1
#> # ... with 23,463 more rows

... приводит к целым числам;manualish_count$n содержит <int> egers.

Используя igraph, на первый взгляд все выглядит хорошо ...

(ig_count <- count_multiple(USairports)) %>% head(10)
#>  [1]  2  2 10  1  1 20 10  1  1  1

... но на самом деле есть дроби:

ig_count[ig_count %% 1 != 0]
#>  [1] 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1.5 1.5 1.5 1.5 0.5 1.5 1.5 0.5 0.5 0.5
#> [18] 0.5 1.5 1.5 1.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5
#> [35] 0.5

Я неправильно понимаю цель count_multiple() или неправильно ее использую?

igraph_version()
#> [1] "1.2.2"

1 Ответ

0 голосов
/ 25 августа 2018

Это из-за того, как циклы (собственные ребра) обрабатываются с count_multiple.

ig_count <- count_multiple(USairports)
x <- which(ig_count %% 1 != 0)

E(USairports)[x]

#[1] HOM->HOM FYU->FYU OME->OME ANI->ANI KLL->KLL WFB->WFB RIC->RIC DEN->DEN
#[9] BLD->BLD BLD->BLD BLD->BLD DCA->DCA DEN->DEN DEN->DEN MCI->MCI SSB->SSB
#[17] MIA->MIA KEH->KEH LKE->LKE LKE->LKE LKE->LKE LPS->LPS VGT->VGT DET->DET
#[25] CID->CID CLE->CLE JFK->JFK LGA->LGA MKE->MKE ORD->ORD PHL->PHL GRR->GRR
#[33] MEM->MEM JNU->JNU MSP->MSP

Основная процедура c igraph_count_multiple явно делит число ребер на 2 для циклов.

 /* for loop edges, divide the result by two */
    if (to == from) VECTOR(*res)[i] /= 2;

Вы можете избежать этого, считая кратные только по нециклам

ig_count2 <- count_multiple(simplify(USairports, remove.multiple = FALSE, remove.loops=TRUE)) 

ig_count2[1:10]
#[1]  2  2 10  1  1 20 10  1  1  1

which(ig_count2 %% 1 != 0)
#integer(0)
...