No.22077 R ファイルの突合せ  【明石】 2016/07/18(Mon) 08:55

青木先生,
いつもお世話になり,ありがとうございます,明石と申します。

Rプログラムについて,ご教示いただきたいことが出てきました。
どうぞ,よろしくお願いいたします,

------
添付の画像をご覧ください。

お示しをしました例題は,グラフネットワークのファイルです。

da1 は,ノードリストです。
id,label,score の3列からなります。

da2 は,エッジリストです。
node1,node2,weight の3列からなります。

やりたいことは,
dat2 の node1,node2 を,
dat1 と突合せをして,label を id に置き換えた dat3 を生成出力することです。

動くプログラムはできましたが,
ノードリスト,エッジリストのサイズが膨大なので,
処理効率,R言語の良さ(ベクトル化処理,論理ベクトルなど)の観点から,
もっと良いプログラムを勉強したいと思っています。

良いお手本をお示しいただけると,大変に助かります。
どうぞ,よろしくお願いいたします。

【プログラム例】
dat1 <- read.table("dat1.csv",header=T, sep="," ,stringsAsFactors=F)

dat2 <- read.table("dat2.csv",header=T, sep="," ,stringsAsFactors=F)

v <- dat1$label

dat3 <- dat2

for(i in 1:nrow(dat2)) {

  n1 <- which(is.element(v, dat2$node1[i]))
  dat3$node1[i] <- dat1$id[n1]

  n2 <- which(is.element(v, dat2$node2[i]))
  dat3$node2[i] <- dat1$id[n2]

}

dat3

> dat3
   node1 node2 weight
1      1     2   0.70
2      1     3   0.64
3      1     6   0.55
4      1     9   0.44
5      2     3   0.88
6      2     5   0.50
7      2     8   0.41
8      3     4   0.66
9      3     7   0.60
10     3     8   0.55
11     3     9   0.39
12     4     8   0.38
13     4     9   0.33


No.22078 Re: R ファイルの突合せ  【青木繁伸】 2016/07/18(Mon) 13:56

もとのプログラムも十分早いと思いますが,
data.frame(node1=apply(outer(dat1$label, dat2$node1, "=="), 2, which),
node2=apply(outer(dat1$label, dat2$node2, "=="), 2, which),
weight=dat2$weight)

data.frame(node1=outer(dat2$node1, dat1$label, "==") %*% seq_along(dat1$label),
node2=outer(dat2$node2, dat1$label, "==") %*% seq_along(dat1$label),
weight=dat2$weight)

data.frame(node1=charmatch(dat2$node1, dat1$label),
node2=charmatch(dat2$node2, dat1$label),
weight=dat2$weight)
のようなものも。
どれがどれくらい速いか試してみてください。

No.22079 【御礼】Re: R ファイルの突合せ  【明石】 2016/07/18(Mon) 18:36

青木先生,
いつもお世話になり,ありがとうございます,明石と申します。

良いお手本を3つもお示しくださり,大変に助かりました。

apply関数を使う方法を期待していましたので,とても勉強になります。

まだ使ったことのないouter関数があり,良い勉強になります。

お休みのところ,大変に有難いご教示をいただき,誠にありがとうございました。

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