Igraph:根据条件从ego网络中删除边(那些不是来自ego的边)
我有一个朋友网络,我试图绘制每个自我网络,只显示出每个自我的提名。当我绘制自我网络时,它包括指向自我的箭头和相互连接的边缘。我想有条件地删除不是来自自我的边缘。示例数据和代码如下:Igraph:根据条件从ego网络中删除边(那些不是来自ego的边),r,dplyr,tidyverse,igraph,tidyr,R,Dplyr,Tidyverse,Igraph,Tidyr,我有一个朋友网络,我试图绘制每个自我网络,只显示出每个自我的提名。当我绘制自我网络时,它包括指向自我的箭头和相互连接的边缘。我想有条件地删除不是来自自我的边缘。示例数据和代码如下: df<-read.table(text="student_id friendid_1 friendid_2 friendid_3 friendid_4 1 3 NA NA NA 2
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")
df%
枢轴_较长(。,
cols=friendid_1:friendid_4)%>%
选择(学生id,alter=value)%>%
na.省略()
egonet_3%
在%c(“3”)中生成自我图(,顺序=1,节点=V(.)%,模式=“输出”)
as_tbl_图(egonet_3[[1]])%>%
创建_布局(,布局='fr')%>%
ggraph(.)+
几何图形边缘链接(color=“black”,alpha=0.7,
arrow=arrow(type=“closed”,
角度=25,
长度=单位(1.5,'毫米'),
端盖=圆(2,'mm'),
宽度=0.5,show.legend=FALSE)+
几何节点点(尺寸=4)+
geom_节点_标签(aes(标签=名称),排斥=真)+
主题图()+
主题(legend.position=“无”)
此代码为我提供了以下图像:
但是,我希望这样:
有没有一种方法可以有条件地去除不来自自我的边缘?我有许多绘图要绘制,因此手动删除单个边并不理想。Update
如果您有多个自我,并且希望将所有自我网络放在同一个图中,您可以尝试下面的代码
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)
)
}
)
)
)
我想你可以用
distance
代替make\u ego\u graph
g <- graph_from_data_frame(d = df, directed = TRUE)
egonet_3 <- graph_from_edgelist(
cbind(
"3",
subset(names(V(g)), distances(g, v = "3", mode = "out") == 1)
)
)
g是否可以使用id号向量进行此操作并将其放入列表中?所以,如果我想对这个向量中的每个自我都这样做:c(“3”,“7”,“12”,“15”,“20”)@L.Tucker是的,这是可能的。看我的更新。非常感谢!
> 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
g <- graph_from_data_frame(d = df, directed = TRUE)
egonet_3 <- graph_from_edgelist(
cbind(
"3",
subset(names(V(g)), distances(g, v = "3", mode = "out") == 1)
)
)