#r #social-networking
#r #социальные сети
Вопрос:
Я думаю, что это работает правильно, но я хочу имитировать что-то похожее на предложение Facebook для друзей. Просто я ищу соединения 2-й степени (друзей ваших друзей, с которыми у вас нет связи). Я хочу сохранить это как ориентированный граф и определить внешние соединения 2-й степени (люди, с которыми подключаются ваши друзья).
Я полагаю, что мой фиктивный код достигает этого, но поскольку ссылка находится на индексах, а не на метках вершин, я надеялся, что вы могли бы помочь мне изменить код, чтобы вернуть полезные имена.
### create some fake data
library(igraph)
from <- sample(LETTERS, 50, replace=T)
to <- sample(LETTERS, 50, replace=T)
rel <- data.frame(from, to)
head(rel)
### lets plot the data
g <- graph.data.frame(rel)
summary(g)
plot(g, vertex.label=LETTERS, edge.arrow.size=.1)
## find the 2nd degree connections
d1 <- unlist(neighborhood(g, 1, nodes="F", mode="out"))
d2 <- unlist(neighborhood(g, 2, nodes="F", mode="out"))
d1;d2;
setdiff(d2,d1)
ВОЗВРАТ
> setdiff(d2,d1)
[1] 13
Любая помощь, которую вы можете предоставить, будет отличной. Очевидно, я хочу оставаться в пределах R.
Ответ №1:
Вы можете индексировать обратно в вершины графа, такие как:
> V(g)[setdiff(d2,d1)]
Vertex sequence:
[1] "B" "W" "G"
Также ознакомьтесь ?V
с способами получения информации такого типа посредством прямого индексирования.
Ответ №2:
Вы можете использовать матрицу смежности $ G $ графа $ g $ (здесь нет latex?). Одним из свойств матрицы смежности является то, что ее n-я степень дает вам количество $ n $-переходов (путей длиной n).
G <- get.adjacency(g)
G2 <- G %*% G # G2 contains 2-walks
diag(G2) <- 0 # take out loops
G2[G2!=0] <- 1 # normalize G2, not interested in multiplicity of walks
g2 <- graph.adjacency(G2)
Ребро в графе g2
представляет собой связь «друг друга».
Комментарии:
1. хорошее решение. Что, если я умножу G2 %*% G2? получаю ли я 3 обхода?