如何解决使用 tidygraph 为每个节点计算给定类型的边
目标:我想计算每个节点的部分类型的传入边数。我该怎么做?
标准:
- 我需要使用 R 包 tidygraph
- 允许我通过 magrittr 管道改变现有图形的答案更好
- 代码行越少越好
以下代码将生成示例图
g <- play_erdos_renyi(n = 20,p = .10) %>%
activate(edges) %>%
mutate(type = sample(c('a','b','c'),size = n(),replace = T))
理想的输出,当搜索(例如)传入的 g 边时,如果类型“a”看起来像:
Node type_a_edges
X 3
Y 1
Z 4
...
编辑:添加了一个数字以使问题更具体。
解决方法
这是一个 tidygraph
+ dplyr
选项
g %>%
activate(edges) %>%
filter(type == "a") %>%
as_tibble() %>%
group_by(to) %>%
summarise(indegree_a = n())
给出所有类型“A”向内边缘的计数
# A tibble: 8 x 2
to indegree_a
<int> <int>
1 3 1
2 5 1
3 8 2
4 11 1
5 12 1
6 15 2
7 17 2
8 18 2
如果你想获得所有节点的完整信息,你可以试试下面的代码
g %>%
activate(edges) %>%
as_tibble() %>%
select(-from) %>%
mutate(counts = 1) %>%
arrange(type) %>%
pivot_wider(
names_from = type,values_from = counts,values_fill = 0,values_fn = sum,names_glue = "indegree_{.name}"
) %>%
arrange(to)
给出
# A tibble: 18 x 4
to indegree_a indegree_b indegree_c
<int> <dbl> <dbl> <dbl>
1 1 0 1 2
2 2 0 0 1
3 3 1 0 0
4 4 0 2 0
5 5 1 0 2
6 6 0 1 1
7 8 2 1 0
8 9 0 0 1
9 10 0 0 1
10 11 1 1 0
11 12 1 0 1
12 13 0 1 2
13 15 2 0 0
14 16 0 3 0
15 17 2 0 0
16 18 2 1 0
17 19 0 0 1
18 20 0 1 0
,
这将产生与请求一致的输出
g %>%
activate(nodes) %>%
mutate(
indegree_type_a = centrality_degree(
weights = as.numeric(.E()$type == 'a'),mode = 'in'))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。