2012-06-19 2 views
0

Я работаю с сетевыми данными и наткнулся нечетной (или, по крайней мере, я не ожидал) поведение с count.multiple в igraph пакете в R.трудно понять count.multiple и упростить в igraph

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")) 

То, что я хочу, это подсчет всех краев и использование мультипликаторов в качестве веса.

когда я 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' присваивает вес 3 краям a → b, но их еще три; 'simplify' затем добавляет эти веса, в результате чего общий вес составляет 9. В итоге мы получаем квадрат нужного веса. –

+0

Отлично. Спасибо, что поняли! – crock1255

Смежные вопросы