Я не нашел ответа на свой вопрос, хотя он кажется простым - если на него ответили, пожалуйста, прости меня. Я работаю с направленными взвешенными сетевыми данными и хочу вычислить «экспозицию» каждого узла для некоторого атрибута их исходящих соседей путем суммирования значения для каждого соседа и взвешивания по весам ребер.
Это довольно легко сделать с помощью al oop. g [] являясь матрицей смежности, я получаю:
library(igraph)
#Data example
relations <- data.frame(from=c("Bob", "Cecil", "Cecil", "David", "David", "Esmeralda"),
to=c("Alice", "Bob", "Alice", "Alice", "Bob", "Alice"),
weight=c(4,5,5,2,1,1))
g <- graph.data.frame(relations, directed=TRUE)
# Loop
for (i in c(1:nrow(g[]))){
nodes$neigh_activity[[i]] <- sum(nodes[which(g[i,]>0), ]$activity*g[i, which(g[i,]>0)])
}
Я хочу векторизовать это l oop. Действительно, в моих реальных данных у меня более 90 000 узлов, поэтому это занимает некоторое время ... Я слышал, что векторизация может значительно сократить время вычислений.
Я не уверен в пути к go, так как не могу ввести вектор в g[i,]
, иначе сумма обрывается. Я пытался использовать split и работать со списком векторов, но это кажется еще более неэффективным.
Спасибо большое! Robin