Вы не можете умножить traveltime
на commuters
заранее: правильно. Это мешало бы весам кратчайшего пути.
После того, как вы отредактируете, я согласен, что ваши необработанные данные дадут вам хорошее представление о том, сколько и куда путешествует.
Однако я подумал о следующих проблемах:
Сколько пассажиров путешествует в каждом направлении между двумя станциями? Я предполагаю из вашей mode="all"
, что ваша сеть не является направленной. Должны ли мы считать, что это половина количества пассажиров между двумя станциями, которые движутся в каждом направлении?
Как относиться к общему количеству путешественников?
Если 20 человек - это совокупный путешественник между А и В и 23 человека между В и С, сколько человек прошло между А и С? Я не верю, что после агрегирования ваших индивидуальных do_data $traveltime
и $commuters
обеспечивает лучшую точность, чем: от 0 до 20 человек .
Что касается фактического вопроса, есть ли более простой вариант умножения пассажиров на время поездки в матрице кратчайшего пути? , или действительно, если вы можете выполнить любую операцию атрибутов ребра по кратчайшим путям В сети я прошу прощения за мой ошибочный ответ и надеюсь, что на этот раз я все понял правильно. Это не красиво и не быстро, но оно делает свою работу:
library(igraph)
# Create random connected graph
g <- erdos.renyi.game(100,150,"gnm", directed=FALSE)
g <- g %>% delete_vertices(degree(g) == 0)
E(g)$traveltime <- sample(3:10, length(E(g)), replace=T)
E(g)$commuters <- sample(20:35, length(E(g)), replace=T)
E(g)$weight <- E(g)$traveltime
# This is uggly, slow, and grose but sure to do what you wish. It calculates
# a matrix of all shortest paths (using the graph-$weight for "friction" in
# the network, and then sums all the $comuters along each registred path)
commuters <- lapply(1:length(V(g)), function(i){
# It loops the adjacency-matrix.
# First, this gets the paths which constitute the shortest path from i to
# every other vertecy.
paths_from_i <- (shortest_paths(g, i, V(g), 'all', weights=E(g)$traveltime))$vpath
# Here you can build any per-shortest-path opperation of edge-attributes along
# each of those paths. In this case we're multiplying the number of commuters
# with the travelling time for each shortest path.
sapply(paths_from_i, function(x) sum( E(g)$commuters[x] * E(g)$traveltime[x]) )
}
)
# Convert list to matrix: Each value in the matrix is produced by the
# $traveltime * $commuters attributes of all edges in the shortest paths
# between every pair of nodes in the network g.
commute_matrix <- do.call(rbind, commuters)