No.21986 R ネットワークグラフのエッジリストの集計  【明石】 2016/04/29(Fri) 11:46

青木先生 様,
お世話になります,明石と申します。

先日は,Rの,表〜リストの相互変換についてご教示をいただき,
誠にありがとうございました。

大変に良い勉強をさせていただきました。

−−−
今回は,集計について,ご教示をいただければ助かります。
どうぞ,よろしくお願いいたします。

添付の画像ファイルをご覧ください。

右側に,ネットワークグラフがあります。(大規模グラフ)

このネットワークのエッジリストを,左側の3つ組で表しています。
 lhsは,エッジの始点ノード番号
 rhsは,エッジの終点ノード番号
 weightは,エッジの重み

この3つ組(ファイル名は net.csv)を読み込み,
各ノードごとに,接続している全てのエッジの重みの和を計算し,
以下のように出力したいと考えています。
ノード番号 エッジ重み和
1          17.613908
2          26.414958
3          14.171645
4          21.339434
5          22.665279
6          22.433722
7          14.537605
8          10.936302
9          25.582985
10         25.582985
・・・・・・
このRプログラムを作成しましたが,
ご専門家から見れば,Rの利点を活かして,まだまだ改良の余地があると思われます。

ご教示をいただければ,大変に勉強になります。
どうぞ,よろしくお願いいたします。
dat <- read.table("net.csv", header=TRUE, sep=",")

v1 <- unique(dat$lhs)
v2 <- unique(dat$rhs)
v <- union(v1,v2)

n <- length(v)

w <- numeric(n)

for (i in 1:n) {
  s1 <- is.element(dat$lhs, v[i])
  s2 <- is.element(dat$rhs, v[i])
  s3 <- s1 | s2
  d <- dat[s3,]
  w[i] <- sum(d$weight)
}

df <- data.frame(ノード番号=v, エッジ重み和=w) 


No.21987 Re: R ネットワークグラフのエッジリストの集計  【青木繁伸】 2016/04/29(Fri) 17:22

lhs と rhs を添え字として,エッジの重みを要素とする行列 mat を作り,行和ベクトルとと列和ベクトルの和が「重み和」になるので,以下のようなプログラムができる
dat = data.frame(lhs=c(3,3,2,5,6), rhs=c(2,5,5,4,2), weight=c(0.1, 0.2, 0.2, 0.3, 0.5))

v = sort(unique(c(dat[, 1], dat[, 2])))
m = max(v)
mat = matrix(0, m, m)
subscript = as.matrix(dat[, 1:2])
mat[subscript] = dat[, 3]
w = colSums(mat) + rowSums(mat)
data.frame(ノード = v, 重み和 = w[v])

mat
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    0  0.0    0  0.0  0.0    0
[2,]    0  0.0    0  0.0  0.2    0
[3,]    0  0.1    0  0.0  0.2    0
[4,]    0  0.0    0  0.0  0.0    0
[5,]    0  0.0    0  0.3  0.0    0
[6,]    0  0.5    0  0.0  0.0    0
結果の出力順は,あなたのプログラムの v <- union(v1,v2) を, v <- sort(union(v1,v2)) とすれば同じになる。

mat 行列の疎の具合によるが,場合によってはかなりの処理速度が得られるはず。

No.21988 【御礼】 Re: R ネットワークグラフのエッジリストの集計  【明石】 2016/04/29(Fri) 18:12

青木先生 様,
お世話になります,明石と申します。

お休みのところ,ご丁寧なご教示を頂戴し,誠にありがとうございます。
追試し,調査して,使いこなしたいと思います。

毎々,ありがとうございます。

● 「統計学関連なんでもあり」の過去ログ--- 048 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る