我有发明人在专利方面的合作数据。每个发明人都是一个节点,每个边代表两个发明人共同合作的一项专利。一些专利有> 2个发明人,因此有些专利具有多个边缘。
我想对在BOISE中至少有一个发明人的专利进行分割,但并不是所有发明人都在BOISE中。其他专利和发明人需要从选择中排除。
例如:
gg <- graph.atlas(711)
V(gg)$name <- 1:7
V(gg)$city <- c("BOISE","NEW YORK","NEW YORK","BOISE","BOISE","LA","LA")
V(gg)$color <- ifelse(V(gg)$city=="BOISE", "orange","yellow")
gg<-delete.edges(gg, E(gg, P=c(1,2,2,3,2,7,7,6,7,3,3,4,3,5,4,5,5,6,6,1)))
gg <- add.edges(gg,c(1,4,4,5,5,1),attr=list(patent=1))
gg <- add.edges(gg,c(7,5,5,4,4,7),attr=list(patent=2))
gg <- add.edges(gg,c(7,3,3,5,5,7),attr=list(patent=3))
gg <- add.edges(gg,c(2,7,7,6,6,2),attr=list(patent=4))
gg <- add.edges(gg,c(6,4),attr=list(patent=5))
plot(gg, edge.label=E(gg)$patent)
产生:
从这个网络中,我只想对专利2、3、5边缘上入射的所有节点进行子图绘制。
在此示例中,节点1不应终止于子图中。同样,也应排除与专利#1有关的从节点5到节点4的边缘。
我已经为这个问题苦苦挣扎了一段时间了。这可能吗?
最佳答案
这个怎么样
#final all patent names
patents <- unique(edge.attributes(gg)$patent)
#check if criteria are met for patent
okpatents <- sapply(patents, function(p){
cities <- V(gg)[inc(E(gg)[patent==p])]$city
nc <- sum(cities=="BOISE")
return(nc>0 & nc < length(cities))
})
#extract subgraph
gs <- subgraph.edges(gg, E(gg)[patent %in% patents[okpatents]])
#verify
plot(gs, edge.label=E(gs)$patent)
PS。很好的可重现示例;)
关于r - R和igraph : subgraph nodes based on attributes of other nodes that are incident on edge,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25507007/