2017-05-01 14 views
1

リスト内のベクトル文字列を互いに比較する行列を作成しました。比較行列を%で表します。

sapply(names(setlist), function(x) sapply(names(setlist), function(y) sum(setlist[[x]] %in% setlist[[y]]))) 


       A    B    C    D 
A    50   1    0    0 
B    1    6    0    0 
C    0    0    51    8 
D    0    0    8    46 

例えばまったく同じであるベクトルAとベクトルB内の文字列の数がAで50の総文字列で、1であり、私はデータを正規化したいB.

以内6上記の例を使用してください。 AとBの合計発声は56なので、1を56 = .018で割ります。最終的な結果は次のようになります。

   A    B    C    D 
A    .5   .018   0    0 
B    .018   .5   0    0 
C    0    0    .5    .082 
D    0    0    .082   .5 
+0

この正規化はどのように機能しますか?なぜ正規化後の対角が1ですか?私はすべての値を正規化(A-Aは0,082)するか、行/列で正規化する(A-Bは1/51 = 0,0196)と考えました。 –

答えて

1
#DATA 
m = structure(c(50L, 1L, 0L, 0L, 1L, 6L, 0L, 0L, 0L, 0L, 51L, 8L, 
0L, 0L, 8L, 46L), .Dim = c(4L, 4L), .Dimnames = list(c("A", "B", 
"C", "D"), c("A", "B", "C", "D"))) 

使用sapplyあなたは対角要素に1を置き換えることができ、各列を通過し、

sapply(X = 1:NCOL(m), function(i) round(x = m[,i]/(m[i,i]+diag(m)), digits = 3)) 
# [,1] [,2] [,3] [,4] 
#A 0.500 0.018 0.000 0.000 
#B 0.018 0.500 0.000 0.000 
#C 0.000 0.000 0.500 0.082 
#D 0.000 0.000 0.082 0.500 

を正規化するreplace

sapply(X = 1:NCOL(m), function(i) 
    replace(x = round(x = m[,i]/(m[i,i]+diag(m)), digits = 3), 
      list = i, 
      values = 1)) 
# [,1] [,2] [,3] [,4] 
#A 1.000 0.018 0.000 0.000 
#B 0.018 1.000 0.000 0.000 
#C 0.000 0.000 1.000 0.082 
#D 0.000 0.000 0.082 1.000 
+0

優秀、これは働いた。 [、1]、[2]、[3]、[4]の代わりに、A、B、C、Dと同じようにヘッダーをどのように保つでしょうか? –

+0

あなたは 'dimnames(m)[[2]]' –