R iGraph:如何选择符合特定规则的顶点

7
这应该是一个相当简单的问题,但我不知道如何做到这一点。比如说,我有这个图形:

enter image description here

每个节点都有一个日期,我想找到具有最大出度的节点,仅限于那些在中位数之前有日期的节点。 我尝试了这个:
library(igraph)
nodes <- data.frame(name=c("a", "c", "d", "e", "f", "g", "i", "j", "k"),
                    date = c(27,   13,  0,   18,  0,   8,   44,  26, 22))
relations <- data.frame(from=c("d", "d", "f", "f","f", "g","g","g","c","c", "e"),
                        to=c("i", "f","d","c","g","k","a","c","a", "e","j"))
ggg <- graph.data.frame(relations, directed=TRUE, vertices=nodes)

V(ggg)$label <- V(ggg)$name
plot(ggg, layout = layout.fruchterman.reingold.grid, edge.curved=FALSE, 
           edge.arrow.size=0.2,edge.arrow.width=0.4)

V(ggg)$label <- V(ggg)$date
plot(ggg, layout = layout.fruchterman.reingold.grid, edge.curved=FALSE, 
     edge.arrow.size=0.2,edge.arrow.width=0.4)

median_delay <- median(V(ggg)$date)
vert_before_median <- V(ggg)[  V(ggg)$date <= median_delay  ]
wnodes <- V(ggg)$name[ degree(ggg,v=vert_before_median,mode="out")==max(degree(ggg,v=vert_before_median,mode="out")) ] 

到这里似乎一切正常:

> degree(ggg,v=vert_before_median,mode="out")==max(degree(ggg,v=vert_before_median,mode="out"))
    c     d     e     f     g 
FALSE FALSE FALSE  TRUE  TRUE 

但是,当我想要持有满足这个属性的节点时,我遇到了麻烦。我认为wnodes应该包含节点"f"和"g",而不是其他。

> wnodes
[1] "e" "f" "k"

看来我在尝试从图形中选择顶点时漏掉了什么。我已经尝试使用 which,但还是不对:

> V(ggg)[which( degree(ggg,v=vert_before_median,mode="out")==max(degree(ggg,v=vert_before_median,mode="out"))   )]
Vertex sequence:
[1] "e" "f"

任何想法?
1个回答

4

选择中位数之前的子集而不是所有顶点,这样你就可以得到你想要的结果。

wnodes <- vert_before_median[ degree(ggg,v=vert_before_median,mode="out")==max(degree(ggg,v=vert_before_median,mode="out")) ]

在你上面的代码中,当你使用它来对长度为9的所有顶点进行子集操作时,R会自动循环遍历长度为5的逻辑向量(FALSE, FALSE, FALSE, TRUE, TRUE)。


谢谢你,Ryan!明天我会尝试你的解决方案,因为目前我正在为在我的Mac上安装iGraph包而烦恼得要命! - Nonancourt
刚刚检查了一下,那正是我想要的。谢谢!我还编辑了问题,使其更加自包含。 - Nonancourt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接