微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Igraph:根据条件从自我网络中删除边缘那些不是来自自我的

如何解决Igraph:根据条件从自我网络中删除边缘那些不是来自自我的

我有一个友谊网络,我正在尝试绘制每个自我网络,只显示每个自我的提名。当我绘制自我网络时,它包括指向自我的箭头和连接彼此的边缘。我想有条件地删除不是来自自我的边缘。示例数据和代码如下:

df<-read.table(text="student_id friendid_1    friendid_2    friendid_3    friendid_4
1          3             NA            NA            NA
2          5             2             3             NA
3          2             4             5             NA
4          1             6             NA            3
5          1             NA            6             2
6          5             NA            2             1
7          8             NA            NA            NA
8          NA            9             NA            NA
9          8             7             NA            NA
10         7             9             NA            NA
11         19            15            NA            12
12         20            NA            19            11
13         15            19            11            NA
14         16            NA            12            18
15         17            20            17            NA
16         14            19            20            13
17         20            18            13            14
18         13            NA            19            17
19         17            NA            16            11
20         13            17            11            14",header = TRUE) %>%
           pivot_longer(.,cols = friendid_1:friendid_4) %>%
           select(student_id,alter = value) %>%
           na.omit()


egonet_3 <- graph_from_data_frame(d = df,directed = TRUE) %>% 
            make_ego_graph(.,order = 1,nodes = V(.) %in% c("3"),mode = "out")


as_tbl_graph(egonet_3[[1]]) %>%
  create_layout(.,layout = 'fr') %>%
  ggraph(.) + 
  geom_edge_link(color = "black",alpha = 0.7,arrow = arrow(type = "closed",angle = 25,length = unit(1.5,'mm')),end_cap = circle(2,'mm'),width = 0.5,show.legend = FALSE) +        
  geom_node_point(size = 4) +
  geom_node_label(aes(label = name),repel = TRUE) + 
  theme_graph() +
  theme(legend.position = "none")  

这段代码给了我这张图片

enter image description here

但是,我想看起来像这样:

enter image description here

有没有办法有条件地去除不是来自自我的边缘?我要绘制许多图,因此手动去除单个边缘并不理想。

解决方法

更新

如果你有多个 ego,并且想把所有的 ego 网络放在同一个图中,你可以试试下面的代码

egoid <- c("3","7","12","15","20")

egonet <- graph_from_edgelist(
  do.call(
    rbind,lapply(
      egoid,function(x) {
        cbind(
          x,subset(names(V(g)),distances(g,v = x,mode = "out") == 1)
        )
      }
    )
  )
)

给出

enter image description here

否则,您可以将每个自我网络保存在一个列表中,例如,

egonetlst <- lapply(
  egoid,function(x) {
    graph_from_edgelist(
      cbind(
        x,mode = "out") == 1)
      )
    )
  }
)

给出

> egonetlst
[[1]]
IGRAPH 9ca6dac DN-- 4 3 --
+ attr: name (v/c)
+ edges from 9ca6dac (vertex names):
[1] 3->2 3->4 3->5

[[2]]
IGRAPH 9ca7dd3 DN-- 2 1 --
+ attr: name (v/c)
+ edge from 9ca7dd3 (vertex names):
[1] 7->8

[[3]]
IGRAPH 9ca7dd3 DN-- 4 3 --
+ attr: name (v/c)
+ edges from 9ca7dd3 (vertex names):
[1] 12->11 12->19 12->20

[[4]]
IGRAPH 9ca7dd3 DN-- 3 2 --
+ attr: name (v/c)
+ edges from 9ca7dd3 (vertex names):
[1] 15->17 15->20

[[5]]
IGRAPH 9ca7dd3 DN-- 5 4 --
+ attr: name (v/c)
+ edges from 9ca7dd3 (vertex names):
[1] 20->11 20->13 20->14 20->17

我猜你可以用 distance 代替 make_ego_graph

g <- graph_from_data_frame(d = df,directed = TRUE)
egonet_3 <- graph_from_edgelist(
  cbind(
    "3",v = "3",mode = "out") == 1)
  )
)

plot(egonet_3)节目

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。