Я написал функцию, которая получает список вершин и взвешенный и направленный граф 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)
например:
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