Векторизация l oop в R, которая суммирует все значения в каждой строке матрицы - PullRequest
1 голос
/ 10 февраля 2020

Я не нашел ответа на свой вопрос, хотя он кажется простым - если на него ответили, пожалуйста, прости меня. Я работаю с направленными взвешенными сетевыми данными и хочу вычислить «экспозицию» каждого узла для некоторого атрибута их исходящих соседей путем суммирования значения для каждого соседа и взвешивания по весам ребер.

Это довольно легко сделать с помощью 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

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

Спасибо людям, которые ответили!

После некоторых размышлений кажется, что мой вопрос был сформулирован плохо: я не хочу суммировать по строкам, а использовать значения строк для определения весов и индекса для суммы с значения в других данных.

В любом случае, я нашел свой ответ! Простая алгебра была на пути к go:

nodes$neigh_activity<-g[]%*%as.matrix(nodes$activity)

отлично работает.

И это намного быстрее! Вся операция идет в три раза быстрее ОДНОЙ итерации l oop ...

В любом случае, спасибо!

0 голосов
/ 10 февраля 2020
...