R iGraph:如何 select 满足特定规则的顶点
R iGraph: How to select vertices satisfying a certain rule
这应该是一个很简单的问题,但我真的不知道该怎么做。我有,比如说,图中的图表:
每个节点都有一个日期,我想找到出度最大的节点,仅在日期早于中位数的节点中。
我试过这个:
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"
我尝试从图中 select 顶点的方式似乎遗漏了一些东西。我试过 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"
有什么想法吗?
子集 vert_before_median 而不是所有顶点,你应该得到你想要的,
wnodes <- vert_before_median[ degree(ggg,v=vert_before_median,mode="out")==max(degree(ggg,v=vert_before_median,mode="out")) ]
在上面的代码中,当您使用 R 对长度为 9 的所有顶点进行子集化时,它会自动循环长度为 5 的逻辑向量(FALSE、FALSE、FALSE、TRUE、TRUE)。
这应该是一个很简单的问题,但我真的不知道该怎么做。我有,比如说,图中的图表:
每个节点都有一个日期,我想找到出度最大的节点,仅在日期早于中位数的节点中。 我试过这个:
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"
我尝试从图中 select 顶点的方式似乎遗漏了一些东西。我试过 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"
有什么想法吗?
子集 vert_before_median 而不是所有顶点,你应该得到你想要的,
wnodes <- vert_before_median[ degree(ggg,v=vert_before_median,mode="out")==max(degree(ggg,v=vert_before_median,mode="out")) ]
在上面的代码中,当您使用 R 对长度为 9 的所有顶点进行子集化时,它会自动循环长度为 5 的逻辑向量(FALSE、FALSE、FALSE、TRUE、TRUE)。