1

グラフ オブジェクト igraph_obj (計算後に重みが格納される場所) が与えられたグラフ上のリンクのエッジの重み (この場合の適用関数の使用方法は、igraph ライブラリの知識は必要ありません) を返すこの関数があります。 node1 と node2 (データフレーム df に格納されます):

dweight <- function(igraph_obj, node1, node2){
    return(E(igraph_obj)[node1 %->% node2]$weight)
}

この構造を持つデータフレームにこの関数を適用したいと思います:

Node1 Node2 other_column1 other_column2 ...
a     b        1                2       ...
c     d        3                7       ...
...

apply 関数に関するドキュメントとチュートリアルを読んだことがありますが、これまで試したことは、関数 dweight を各 node1、node2 などに適用するのにうまくいきませんでした。それを行うためにループを作成する必要がある場合は、次のようになります。 : df の各行 i に対する dweight(igraph_obj = g, df$Node1[i], df$Node2[i])。

したがって、適用関数は次のようになります。

apply(df, 1, dweight, igraph_obj=g) 

しかし、dweight は、ノード 1、ノード 2 として使用する df の列を知りません。これも機能しません:

apply(df, 1, dweight, igraph_obj=g, node1 = df$Node1, node2 = df$Node1)
4

1 に答える 1

3

試す:

  mapply(dweight, node1=df$Node1, node2=df$Node2, MoreArgs=list(igraph_obj=g))

それはうまくいくはずですが、今はテストできません。そうでない場合は、次を試してください。

  mapply(function(n1, n2) dweight(igraph_obj=g, n1, n2), df$Node1, df$Node2)

あるいは、関数を少し変更したい場合:

dweight <- function(nodes, igraph_obj){
    node1 <- nodes$Node1
    node2 <- nodes$Node2
    return(E(igraph_obj)[node1 %->% node2]$weight)
}

そして、最初に試したように適用機能を使用できます。

 apply(df, 1, dweight, igraph_obj=g) 
于 2013-02-28T04:15:21.310 に答える