Возможное (не обязательно оптимальное) решение заключается в следующем (это одна строка, я просто разбил ее для удобства чтения):
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
, и делим его поэлементно на выходные степени вершин, чтобы получить отношения.