我有一个带有属性W的图。我想要mutate的平均W的邻居。我想保持代码尽可能简单,试图避免maps和其他显式函数的矢量化,因为这是为了教学目的。
我的代码,试图很好地显示每一段代码如下所示:
set.seed(1810)
create_ring(40) %>%
mutate(id = row_number()) -> ring
ring %>%
mutate(W = rnorm(40,75,15)) %>%
mutate(Neighs = local_members(order = 1,
mindist = 1),
k = local_size(order = 1,
mindist = 1)) -> ring
ring %>%
mutate(
W_neighs = map_dbl(
Neighs,
function(x) mean(W[id %in% unlist(x)])
)
)是否有一种无需重复使用map来执行这些操作的方法?Tidygraph有一个类似的包装器,它是local_ave_degree,包装igraph::knn,用C.
另外,我想解释一下morph是否对这些操作有用。
发布于 2022-09-11 22:46:27
我想您可以使用ego从igraph节省很多行(不需要创建列Neighs或k),例如,
set.seed(1810)
ring <- create_ring(40) %>%
mutate(id = row_number()) %>%
mutate(W = rnorm(40, 75, 15)) %>%
mutate(W_neighs =
as.igraph(.) %>%
ego(order = 1, mindist = 1) %>%
sapply(function(v) mean(v$W))
)你会看到
> ring
# A tbl_graph: 40 nodes and 40 edges
#
# An undirected simple graph with 1 component
#
# Node Data: 40 × 3 (active)
id W W_neighs
<int> <dbl> <dbl>
1 1 84.3 96.1
2 2 84.5 91.9
3 3 99.4 91.2
4 4 97.9 67.9
5 5 36.4 89.4
6 6 80.8 51.2
# … with 34 more rows
#
# Edge Data: 40 × 2
from to
<int> <int>
1 1 2
2 2 3
3 3 4
# … with 37 more rowshttps://stackoverflow.com/questions/73673265
复制相似问题