2013-01-13 99 views
0

我正在嘗試通過我的發佈網絡將我的協作網絡化。我用igraph,它很棒。然而,由於我的頂點(代表我在網絡中的那個頂點)到所有共同作者的邊緣都有一個漂亮的圖表。我想從我的頂點刪除一些只通過另一個作者相關的作者。基本上是作者,我只是共同創作。無論如何,我已經確定了這些頂點,並且我知道我的頂點。現在我無法找到一種方法去除僅將這一組邊連接到我的邊。更一般地說,如何從兩組矢量中去除邊,例如V(g)[a]和V(g)[b]?r igraph:從兩組矢量中刪除邊緣

感謝,

這裏有一個例子:

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) 

所以,問題是你如何從有屬性「第二」到具有屬性的「主」的一個作者刪除邊緣,即是從紅色到藍色的?

再次感謝,

回答

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

+0

yeahhhhhhh!有用。謝謝, – jejuba

1

沒有重複的例子,我不知道我有明白你想要什麼。但是,這應該可以幫助您:

##deletes from g edge 1->2. 
g <- delete.edges(g, E(g, P=c(1,2)))