No.22494 R 二重ループをapply()関数で書き直したい  【明石】 2017/12/23(Sat) 16:57

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

Rについてお聞きしたいことがでてきました。
ご教示をいただければ,大変に助かります。
何卒どうぞよろしくお願いいたします。

-----------

添付画像にお示しをしました。

表1に示す,0/1のデータフレーム(変数名 df)から,
列ベクトル同士の共起度数(1−1対のカウント)を計算して,
表2に示す,行列(変数名 mx)に格納します。

二重ループで計算すると以下のようになります。

計算結果は対称行列ですので,上三角行列のみ計算しました。
nc <- ncol(df)

mx <- matrix(0, nc, nc) ###### 結果を格納する行列の確保,0クリア

for(i in 1:(nc-1)) {

v1 <- df[,i]

for (j in (i+1):nc) {
v2 <- df[,j]
mx[i,j] <- sum(v1*v2)
}

}
二重ループをapply()関数を使って書き直した場合について,
例示いただければ,大変に勉強になります。

計算結果は対称行列ですので,
二重ループの場合には,上三角行列のみ計算しましたが,
apply()関数を使う場合には,これは条件ではありません。

お手数をおかけいたします。
何卒どうぞよろしくお願いします。


No.22495 Re: R 二重ループをapply()関数で書き直したい  【青木繁伸】 2017/12/23(Sat) 20:25

プログラムする前に,「何をやっているのだろうか?」と考えるとよいと思います。
今の場合,データは 0 か 1 で,両方とも 1 の対を数えるわけです。
set.seed(123)
df = as.data.frame(matrix(sample(0:1, 500, replace = TRUE), ncol = 5))

nc <- ncol(df)
mx <- matrix(0, nc, nc) ###### 結果を格納する行列の確保,0クリア

for (i in 1:(nc - 1)) {
v1 <- df[, i]
for (j in (i + 1):nc) {
v2 <- df[, j]
mx[i, j] <- sum(v1 * v2)
}
}
mx

m = as.matrix(df)
(t(m) %*% m)
結果は,
> mx
[,1] [,2] [,3] [,4] [,5]
[1,] 0 22 20 20 21
[2,] 0 0 21 24 24
[3,] 0 0 0 24 20
[4,] 0 0 0 0 22
[5,] 0 0 0 0 0
> (t(m) %*% m)
V1 V2 V3 V4 V5
V1 47 22 20 20 21
V2 22 50 21 24 24
V3 20 21 48 24 20
V4 20 24 24 44 22
V5 21 24 20 22 46

No.22496 Re: R 二重ループをapply()関数で書き直したい  【明石】 2017/12/23(Sat) 20:44

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

大変に勉強になりました。

ループ → apply()関数 と,安易に,思考停止していたことを恥ずかしく思います。

(t(m) %*% m)
の計算方法は,興味深く,大変に勉強になりました。

先生がお書きになられたこと
> プログラムする前に,
> 「何をやっているのだろうか?」と考えるとよいと思います。

よいクリスマスプレゼントとして,肝に銘じます。

今回も,大変に良い勉強をさせていただき,誠にありがとうございました。

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