No.22383 R ベクトルの計算  【明石】 2017/06/03(Sat) 15:18

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

先日の質問「R 文字列の抽出,突合せ」では,大変にお世話になり,ありがとうございました。

特に,先生からのご教示(No. 22373)で,
table関数の引数に文字列ベクトル与えると,要素の文字列の出現回数を得られることについては,大変に驚きました。
table関数の懐の大きさに感銘しました。Rの凄さに驚きました。

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

ーーー

表1は,単語のラベル,特徴ベクトルを示しています。
単語のラベルは w1,w2,w3,w4,w5 の5種類,特徴ベクトルは7次元とします。
(特徴ベクトルの数字自体には特に意味はありません)

表1 単語(ラベル,特徴ベクトル)
----------------------
ラベル 特徴ベクトル
----------------------
w1 1 2 3 4 3 2 1
w2 2 2 4 3 2 1 2
w3 1 3 3 2 1 2 3
w4 3 2 1 2 2 2 1
w5 1 4 2 2 3 4 1
----------------------
表2は,文に出現する単語の出現回数を示しています。
文の数は7(7行)で,各文に出現する単語のラベルは表1とリンクします。

表2 文(単語の出現回数)
-------------------------
w1 w2 w3 w4 w5
-------------------------
2 1 0 3 2
1 0 0 3 2
1 3 3 2 1
3 2 0 2 0
0 0 3 0 1
3 0 3 3 2
1 2 3 4 5
----------------------
表1と表2から,以下のルールで,文の特徴ベクトルを作成します。

【文の特徴ベクトルの作成ルール】
表2の各文について,
出現する各単語(表2)について,その特徴ベクトル(表1)に,出現回数(表2)を乗じたものを総計して,単語の出現総数で割る

【例示】
表2の1行目の文について,文の特徴ベクトルを計算すると
(2+w1ベクトル + 1* w2ベクトル + 3*w4ベクトル + 2*w5ベクトル)/(2+1+3+2)

表1,2は,行,列ともに大規模であることから,効率的な計算方法を検討しています。

ご教示をいただければ大変に助かります。
何卒どうぞ,よろしくお願いいたします。

No.22384 Re: R ベクトルの計算  【荒】 2017/06/03(Sat) 21:10

tab1 <- matrix(c(1, 2, 3, 4, 3, 2, 1,
2, 2, 4, 3, 2, 1, 2,
1, 3, 3, 2, 1, 2, 3,
3, 2, 1, 2, 2, 2, 1,
1, 4, 2, 2, 3, 4, 1), 5, byrow = TRUE)

tab2 <- matrix(c(2, 1, 0, 3, 2,
1, 0, 0, 3, 2,
1, 3, 3, 2, 1,
3, 2, 0, 2, 0,
0, 0, 3, 0, 1,
3, 0, 3, 3, 2,
1, 2, 3, 4, 5),,5, byrow = TRUE)

t(sapply(seq(nrow(tab2)),
function(i) colSums(tab1 * tab2[i,])/sum(tab2[i,])))

[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 1.875000 2.500000 2.125000 2.625000 2.500000 2.375000 1.125000
[2,] 2.000000 2.666667 1.666667 2.333333 2.500000 2.666667 1.000000
[3,] 1.700000 2.500000 2.800000 2.500000 1.900000 1.900000 1.900000
[4,] 1.857143 2.000000 2.714286 3.142857 2.428571 1.714286 1.285714
[5,] 1.000000 3.250000 2.750000 2.000000 1.500000 2.500000 2.500000
[6,] 1.545455 2.636364 2.272727 2.545455 2.181818 2.363636 1.545455
[7,] 1.666667 2.866667 2.266667 2.266667 2.200000 2.533333 1.533333
でお望みの結果が得られているでしょうか。

表2の1行目を例にすると
> tab1 * tab2[1,]
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 2 4 6 8 6 4 2
[2,] 2 2 4 3 2 1 2
[3,] 0 0 0 0 0 0 0
[4,] 9 6 3 6 6 6 3
[5,] 2 8 4 4 6 8 2

> colSums(tab1 * tab2[1,])
[1] 15 20 17 21 20 19 9

> sum(tab2[1,])
[1] 8

> colSums(tab1 * tab2[1,])/sum(tab2[1,])
[1] 1.875 2.500 2.125 2.625 2.500 2.375 1.125
をsapply関数でtab2の行ごとに計算し
t関数で行と列を入れ替えています。

確認をお願いします。

No.22386 Re: R ベクトルの計算  【荒】 2017/06/04(Sun) 05:11

> (tab2 %*% tab1)/rowSums(tab2)
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 1.875000 2.500000 2.125000 2.625000 2.500000 2.375000 1.125000
[2,] 2.000000 2.666667 1.666667 2.333333 2.500000 2.666667 1.000000
[3,] 1.700000 2.500000 2.800000 2.500000 1.900000 1.900000 1.900000
[4,] 1.857143 2.000000 2.714286 3.142857 2.428571 1.714286 1.285714
[5,] 1.000000 3.250000 2.750000 2.000000 1.500000 2.500000 2.500000
[6,] 1.545455 2.636364 2.272727 2.545455 2.181818 2.363636 1.545455
[7,] 1.666667 2.866667 2.266667 2.266667 2.200000 2.533333 1.533333
の方が簡単ですね。

No.22387 【御礼】 Re: R ベクトルの計算  【明石】 2017/06/04(Sun) 07:58

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

荒 様,
貴重なご教示をいただきまして,ありがとうございます。

確認させていただきました。
ここで使われている考え方は,大変に勉強になりました。

心から御礼を申し上げます。

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