nc <- ncol(df)二重ループをapply()関数を使って書き直した場合について,
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)
}
}
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 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る