Как мне создать атрибуты вершин, основанные на атрибутах соседей вершин в igraph? - PullRequest
2 голосов
/ 02 октября 2011

Например, как бы я рассчитал для каждой вершины процент связей, направленных наружу на мужчин?

g <- erdos.renyi.game(20, .3, type=c("gnp"), directed = TRUE)
V(g)$male <- rbinom(20,1,.5)
V(g)$male[10] <- NA

1 Ответ

3 голосов
/ 05 октября 2011

Возможное (не обязательно оптимальное) решение заключается в следующем (это одна строка, я просто разбил ее для удобства чтения):

unlist(lapply(get.adjlist(g, mode="out"),
       function (neis) {
           sum(V(g)[neis]$male, na.rm=T)
       }
)) / degree(g, mode="out")

Теперь давайте разберем его на более мелкие части.Сначала мы получаем список смежности графа, используя get.adjlist(g, mode="out").Это дает вам список векторов, каждый из которых содержит внешних соседей вершины.Затем мы применяем функцию к каждому вектору в этом списке, используя lapply.Применяемая функция выглядит следующим образом:

function (neis) {
    sum(V(g)[neis]$male, na.rm=T)
}

Функция просто берет соседей узла в neis и использует их для выбора подмножества вершин из всего набора вершин V(g).Затем для этого подмножества вершин извлекается атрибут male, и значения суммируются, удаляя значения NA на лету.По сути, эта функция дает вам число мужчин в neis.

Теперь, возвращаясь к нашему исходному выражению, мы применили эту функцию к списку смежности графа, используя lapply, получив списокчисла, каждое число, содержащее число соседей-мужчин данной вершины.Мы преобразуем этот список в один вектор R, используя unlist, и делим его поэлементно на выходные степени вершин, чтобы получить отношения.

...