我正在尝试通过我的出版网络联系我的合作。我用的是igraph,它很棒。但是,由于我的顶点(代表我在网络中的那个)的边缘到所有共同作者,我最终得到了一个非常丰富的图形。我想从我的顶点删除边缘到一些只与另一位作者相关的作者。基本上是我只是共同创作的作者。无论如何,我已经确定了这些顶点,我知道我的顶点。现在我找不到一种方法来删除仅将这组边连接起来的边。
更一般地说,如何从两组矢量中去除边缘,例如V(g)[a]和V(g)[b]?
感谢,
这是一个例子:
au1 <- c('deb', 'art', 'deb', 'seb', 'deb', 'deb', 'mar', 'mar', 'joy', 'deb')
au2 <- c('art', 'deb', 'soy', 'deb', 'joy', 'ani', 'deb', 'deb', 'nem', 'mar')
au3 <- c('mar', 'lio', 'mil', 'mar', 'ani', 'lul', 'nem', 'art', 'deb', 'tat')
tata <- data.frame(au1, au2, au3)
xaulist2 <- levels(factor(unlist(tata[,])))
xaulist <- levels(as.factor(xaulist2))
xaulist_att <- c(rep('prime', 2), 'main', 'second', 'second', rep('prime', 3), 'second', rep('prime', 3))
au_att <- data.frame(au_name=xaulist, level=xaulist_att)
# matrix list preparation
tutu <- matrix(NA, nrow=length(xaulist), ncol=dim(tata)[1]) # row are authors and col are papers
for (i in 1:length(xaulist))
{
for (j in 1:dim(tata)[1])
{
ifelse('TRUE' %in% as.character(tata[j,]==xaulist[i]), tutu[i,j] <- 1, tutu[i,j] <- 0)
}
}
tutu[is.na(tutu)] <- 0
tutu[tutu>=1] <- 1 # change it to a Boolean matrix
termMatrix <- tutu %*% t(tutu)
# build a graph from the above matrix
g <- graph.adjacency(termMatrix, weighted=T, mode = 'undirected')
g <- simplify(g) # remove loops
V(g)$label <- xaulist # set labels of vertices
V(g)$degree <- degree(g) # set degrees of vertices
V(g)[xaulist_att=='second']$color <- 'red'
V(g)[xaulist_att=='main']$color <- 'blue'
set.seed(112) # set seed to make the layout reproducible
plot(g)
所以问题是如何从具有属性'main'的作者的边缘移除边缘,该属性为'main',即从红色属性到蓝色属性?
再次感谢,
答案 0 :(得分:5)
这是一种方法,它认为它非常易读:
g2 <- delete.edges(g, E(g)[ V(g)[xaulist_att == 'second'] %--%
V(g)[xaulist_att == 'main' ] ])
## plot the results
coords <- layout.auto(g)
layout(rbind(1:2))
plot(g, layout=coords, main="g")
plot(g2, layout=coords, main="g2")
有关详细信息,请参阅?iterators
。
答案 1 :(得分:1)
如果没有可重复的例子,我不确定我是否理解你想要的东西。但这应该对你有帮助:
##deletes from g edge 1->2.
g <- delete.edges(g, E(g, P=c(1,2)))