【问题标题】:igraph adjacent edges based on attributesigraph 基于属性的相邻边
【发布时间】:2018-12-01 18:58:35
【问题描述】:

对于每个顶点,我对基于条件的相邻边的数量感兴趣。在以下示例中,条件是具有不同的性别。

例子:

library(igraph)
library(ggraph)
library(tidyverse)


nodes <- tibble(id = 1:4, 
                gender = c("M", "F", "F", "M"), 
                names = c("Bob", "Allie", "Mary", "Johnathon"))

edges <- tibble(from = c(1, 3, 2, 4, 1, 2, 1, 4),
                to = c(2, 2, 4, 1, 3, 1, 4, 3))

network <- graph_from_data_frame(d = edges, vertices = nodes, directed = TRUE)

ggraph(network) + 
geom_edge_link(arrow = arrow(length = unit(4, 
'mm')), 
         start_cap = circle(4, 'mm'), 
         end_cap = circle(4, 'mm')) + 
geom_node_text(aes(label = names)) +
theme_graph()

想要的结果:

id  name          adjacent_edges

1    Bob          1
2    Allie        1
3    Mary         2
4    Johnathon    1

【问题讨论】:

  • 既然 Jonathan 在 Mary 和 Allie 旁边,为什么您的预期答案中有 Jonathan = 1? Bob 和 Allie 似乎也错了。
  • 您的代码似乎与您之前已删除的问题中的代码相同。现在情节和期望的结果不同了,但不一致的地方似乎是一样的......最终你似乎确实关心方向,所以也许按照指示定义图表会修复你的例子?
  • 是的,按照指示定义图形有望使事情变得清晰。谢谢!

标签: r igraph


【解决方案1】:

这是一种将基础 R 与 igraph 结合的方法:

nodes %>% 
  mutate(adjacent_edges = colSums(as.matrix(outer(gender, gender, `!=`) * as_adj(network)) != 0))
# A tibble: 4 x 4
#      id gender names     adjacent_edges
#   <int> <chr>  <chr>              <dbl>
# 1     1 M      Bob                    1
# 2     2 F      Allie                  1
# 3     3 F      Mary                   2
# 4     4 M      Johnathon              1

这里

outer(gender, gender, `!=`)

在性别不同时构建一个包含TRUE 条目的矩阵,而as_adj(network)) 是通常的图邻接矩阵。然后他们的产品将在我们想要的时候有非零条目 - 在连接节点具有不同性别的情况下。对这些情况求和会得到预期的结果。

这是另一个,更长但也更透明:

edges %>% full_join(nodes, by = c("from" = "id")) %>% 
  full_join(nodes, by = c("to" = "id"), suff = c(".from", ".to")) %>%
  group_by(to, names.to) %>% summarise(adjacent_edges = sum(gender.to != gender.from)) %>%
  rename(id = to, name = names.to)
# A tibble: 4 x 3
# Groups:   id [4]
#      id name      adjacent_edges
#   <dbl> <chr>              <int>
# 1     1 Bob                    1
# 2     2 Allie                  1
# 3     3 Mary                   2
# 4     4 Johnathon              1

在这种情况下,我们从边列表开始,然后两次添加节点列表:一次是关于 from 边的节点信息,一次是关于 to 边的节点信息,在同一行。然后剩下的就是通过对所有不同性别的邻居求和来总结数据。

【讨论】:

    猜你喜欢
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    相关资源
    最近更新 更多