ノード番号 エッジ重み和 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プログラムを作成しましたが,
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 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る