2012-06-19 12 views
0

簡化我與網絡數據R.無法理解count.multiple和I​​GRAPH

library(igraph) 
library(plyr) 

df <- data.frame(sender = c("a", "a", "a", "b", "b", "c","c","d"), 
       receiver = c("b", "b", "b", "c", "a", "d", "d", "a")) 
工作和所遇到的一個奇怪的(或至少我沒想到它)的行爲與 count.multipleigraph

我想要的是統計所有的邊緣,並使用倍數作爲權重。

當我做我的ddply(df, .(sender, receiver), "nrow")結果是:

sender receiver nrow 
1  a  b 3 
2  b  a 1 
3  b  c 1 
4  c  d 2 
5  d  a 1 

這是我期望的那樣。

但是,我不能重現此使用的igraph的count.multiple,這是我預料到的igraph

df.graph <- graph.edgelist(as.matrix(df)) 
E(df.graph)$weight <- count.multiple(df.graph) 

E(df.graph)$weight內做到這一點產生:

3 3 3 1 1 2 2 1 

然後我用了simplify命令:

df.graph <- simplify(df.graph) 

其中pr oduces

9 1 1 4 1 

我得到的是什麼回事,簡化只是在添加權重,但我不明白爲什麼/時,這將被用來作爲反對什麼,ddply是做..?

有什麼想法?

謝謝!

回答

2

simplify的默認行爲是添加多條邊的權重。

爲了避免重複計算,你可以設置初始權重爲1

g <- graph.edgelist(as.matrix(df)) 
E(g)$weight <- 1 
g <- simplify(g) 
E(g)$weight 

或改變他們聚集的方式。

g <- graph.edgelist(as.matrix(df)) 
E(g)$weight <- count.multiple(g) 
g <- simplify(g, edge.attr.comb = list(weight=max, name="concat", "ignore")) 
E(g)$weight 
+0

所以'count.multiple'然後'simplify'是多餘的? – crock1255

+0

是的:在這個例子中,'count.multiple'給a→b邊賦了權重3,但是仍然有三個; 「簡化」然後添加這些重量,導致總重量爲9.我們最終得到所需重量的平方。 –

+0

太好了。感謝您解決這個問題! – crock1255