我有一个图,每个节点都有一个值(值为红色)。

我想做以下两件事(我想1是2的特例):
(0+2+0)/3=2/3.或节点#3 (1+2)/2=1.5
我查看了into的函数,但是找不到任何正在做这件事的东西(虽然我可能已经看到了)。我怎么能做这个计算?
下面是具有随机值的示例网络的代码。
library(tidyverse)
library(tidygraph)
library(ggraph)
set.seed(6)
q <- tidygraph::play_erdos_renyi(6, p = 0.2) %>%
mutate(id = row_number(),
value = sample(0:3, size = 6, replace = T))
q %>%
ggraph(layout = "with_fr") +
geom_edge_link(arrow = arrow(length = unit(0.2, "inches"),
type = "closed")) +
geom_node_label(aes(label = id)) +
geom_node_text(aes(label = value), color = "red", size = 7,
nudge_x = 0.2, nudge_y = 0.2)编辑,找到了1的解决方案
q %>%
mutate(value_smooth = map_local_dbl(order = 1, mindist = 1, mode = "in",
.f = function(neighborhood, ...) {
mean(as_tibble(neighborhood, active = 'nodes')$value)
}))编辑2,解决方案2,不是我想的最优雅的
q %>%
mutate(value_smooth = map_local_dbl(order = 1, mindist = 0, mode = "in",
.f = function(neighborhood, node, ...) {
ne <- neighborhood
ne <- ne %>%
mutate(d = node_distance_to(which(as_tibble(ne,
active = "nodes")$id == node)))
as_tibble(ne, active = 'nodes') %>%
filter(d != 0) %>%
mutate(helper = value/d) %>%
summarise(m = mean(value)) %>%
pull(m)
}))map_local_dbl的一个更快的替代方案--编辑3
map_local循环遍历图的所有节点。对于大图,这需要很长时间。仅仅为了计算手段,这是不需要的。一个更快的选择是使用邻接矩阵和一些矩阵乘法。
q_adj <- q %>%
igraph::as_adjacency_matrix()
# out
(q_adj %*% as_tibble(q)$value) / Matrix::rowSums(q_adj)
# in
(t(q_adj) %*% as_tibble(q)$value) / Matrix::colSums(q_adj)邻接矩阵的平方是二阶邻接矩阵,等等。因此,问题2的解决方案也可以创建出来。
编辑4,直接加权平均
假设原始图有与每条边相关联的权重。
q <- q %>%
activate(edges) %>%
mutate(w = c(1,0.5,1,0.5,1,0.5,1)) %>%
activate(nodes)我们想要计算直接对等点值的加权平均值。
q_adj_wgt <- q %>%
igraph::as_adjacency_matrix(attr = "w")
# out
(q_adj_wgt %*% as_tibble(q)$value) / Matrix::rowSums(q_adj_wgt)
# in
(t(q_adj_wgt) %*% as_tibble(q)$value) / Matrix::colSums(q_adj_wgt)发布于 2022-03-25 20:54:29
也许你可以试试下面的代码
q %>%
set_vertex_attr(
name = "value",
value = sapply(
ego(., mode = "in", mindist = 1),
function(x) mean(x$value)
)
)这给
# A tbl_graph: 6 nodes and 7 edges
#
# A directed simple graph with 1 component
#
# Node Data: 6 x 2 (active)
id value
<int> <dbl>
1 1 0.5
2 2 NaN
3 3 0.667
4 4 NaN
5 5 1.5
6 6 NaN
#
# Edge Data: 7 x 2
from to
<int> <int>
1 3 1
2 6 1
3 1 3
# ... with 4 more rows发布于 2022-03-25 15:39:28
每个节点都应该被分配到直接节点的值的平均值。
我猜你是说
在更改任何节点值之前,应该为每个节点分配指向它的直接对等点值的平均值。
这看起来很琐碎-也许我错过了什么?
Loop over nodes
Sum values of adjacent nodes
Calculate mean and store in vector by node index
Loop over nodes
Set node value to mean stored in previous loophttps://stackoverflow.com/questions/71618573
复制相似问题