0

注 1: R パッケージの "network" と "sna" を使用しています。

注 2: 元のデータは .csv ファイルのエッジリスト形式です。

エッジリスト データを R に読み込む最良の方法を探していました。一見すると、これは簡単です。

data <- read.csv("file.CSV", header=F)
network <- network(data, matrix.type="edgelist", directed=F) #convert data to network object
val<-data[,3] #here are the values for my edges
set.edge.value(network, "val", val, e=1:length(network$mel))

ネットワークにエッジ値を返すように要求すると (get.edge.values)、正しい値が返されます。

ただし、私が尋ねるsummary(network)と、すべての値が 1 に設定されている隣接行列が返されるだけです (対角線を除く)。値がゼロだったとしても、値は 1 になります。

さらに、 degree(network) のようなものを取得しようとすると、間違った結果が返されます。

私はこれについて何日も探してきました。考えられる解決策は、 を使用することでしたnetwork2<-as.matrix.network(netwerk1, matrix.type="adjacency", attrname="val")。これは機能します。ただし、問題は、これがネットワーク オブジェクトではなくなり、マトリックス クラスになることです。その結果、頂点属性をネットワークに追加できません。network2 を再度ネットワーク オブジェクトに変換すると、ネットワーク内のエッジ値が失われます。

いくつかの助けをいただければ幸いです。

ベスト、フレデリク

4

1 に答える 1

0

あなた自身の質問に答えたようです: ネットワーク オブジェクトを行列に変換するとき、重みに使用する属性を示すattrname引数を含める必要があります。as.matrix.networkすでにネットワーク オブジェクトになっているのに、なぜそれをネットワーク オブジェクトに戻す必要があるのか​​説明できますか?

degree関数には、sna使用するエッジ アトリビュートを指定する引数がないため、重みを持つマトリックスを渡す必要があります。

> library(network)
> library(sna)
> net<-network.initialize(3)
> add.edges(net,c(1,2,3),c(2,3,1))
> set.edge.attribute(net,'weight',c(5,6,7))
> as.matrix(net,matrix.type='adjacency',attrname='weight')
  1 2 3
1 0 5 0
2 0 0 6
3 7 0 0
> netmat<-as.matrix(net,matrix.type='adjacency',attrname='weight')
> degree(net)
[1] 2 2 2
> degree(netmat)
[1] 12 11 13

だからあなたの場合、

degree(network2) 

動作するはずです。

于 2013-03-28T16:08:19.190 に答える