Найти общих соседей выбранных вершин - PullRequest
2 голосов
/ 23 марта 2020

Я написал функцию, которая получает список вершин и взвешенный и направленный граф igraph. Я хочу найти общих соседей входных вершин. вот моя функция:

commonNeighbors <- function(v,g)
{
   library(igraph)
   library(dplyr)
   allNeigh <- list()
   for (i in v)
   {
      allNeigh <- append(allNeigh,c(neighbors(as.undirected(g),paste(i,sep=""))$name))
   }
   allNeigh <- cbind(allNeigh)
   allNeigh <- table(as.numeric(allNeigh))
   allNeigh <- as.data.frame(allNeigh)
   colnames(allNeigh) <- c('vertexID','freq')
   allNeigh <- allNeigh %>% dplyr::filter (freq > 1 & !vertexID %in% v )
   return(allNeigh$vertexID)
 }

пример данных:

library(igraph)

x <- read.table(text = "
from    to  weight
1   2   0.2
1   7   0.5
2   5   0.9
2   6   1
3   4   0.4
3   8   0.6
4   3   0.7
5   8   0.23
6   10  0.24
6   9   0.25
7   1   0.69
7   11  0.75
8   10  0.98
9   12  0.41
9   13  0.32
9   6   0.77
9   15  0.63
10  6   0.21
10  15  0.02
11  14  0.98
12  14  0.54
12  9   0.69
13  14  0.41
15  9   1
14  5   0.63
14  15  0.5
6   14  0.21
10  4   0.68
2   8   0.66
11  1   0.69
1   6   0.25
7   12  0.17
", header = TRUE)

Graph <- graph_from_data_frame(x)
E(Graph)$weight <-  x$weight

set.seed(1); plot(Graph)

enter image description here

например:

commonNeighbors(c(1,15),Graph)
the result: [1] 5
            Levels: 1 5 6 10 14 15

другой пример:

commonNeighbors(c(2,4),Graph)
the result: factor(0)
            Levels: 2 4 8 10 11 12 13 14

первое, что я хочу сделать, это удалить уровни: 2 4 8 .... а второе, если нет общего соседа, вернуть ноль, не фактор ( 0)

Идеальный результат для примера 1: 5
Идеальный результат для примера 2: NULL

1 Ответ

1 голос
/ 25 марта 2020

Эта проблема решается с помощью этого кода:

commonNeighbors <- function(v,g)
{
  library(igraph)
  library(dplyr)
  allNeigh <- list()
  for (i in v)
  {
    allNeigh <- append(allNeigh,c(neighbors(as.undirected(g),paste(i,sep=""))$name))
  }
  allNeigh <- cbind(allNeigh)
  allNeigh <- table(as.numeric(allNeigh))
  allNeigh <- as.data.frame(allNeigh)
  colnames(allNeigh) <- c('vertexID','freq')
  allNeigh <- allNeigh %>% dplyr::filter (freq > 1 & !vertexID %in% v )
  allNeigh <- as.matrix(allNeigh)
  if(length(allNeigh > 0))
  {
    allNeigh <- as.data.frame(allNeigh)
    return(as.matrix(allNeigh$vertexID))
  }
  else
  {
    return(NULL)
  }
}
...