2017-11-23 13 views
2

人と人との間の関係のネットワークを視覚化したいと思います。共起をより効率的に計算する

私のデータは次のようになります。

let networkData = [ 
    ["John","Dylan","Brian"], 
    ["Dylan","Brian"], 
]; 

そして、私はこのような出力をしたい:

let networkMatrix.links = [ 
    {source: "John", target: "Dylan", weight: 1}, 
    {source: "John", target: "Brian", weight: 1}, 
    {source: "Brian", target: "Dylan", weight: 2} 
]; 

自分の体重は1と同じであるので、ジョンとブライアンは一つのグループを共有するジョンのために真でありますとディラン。 DylanとBrianが2つのグループに分かれているので、それらの関係は2の重みになります。

ここで私は助けが必要だと思っています。私のやり方は、networkDataの各行を通り、次に配列の各要素を調べることでした。各要素については、後に来るすべての要素を調べ、スコアをnetworkMatrixに増やします。ここに私のコードです。あなたが見ることができるようにhttps://jsfiddle.net/0t81jg3b/2/

それもjsfiddle上では動作しません。ここで

var i = 0, j = 0; 
networkData.map(function(d) { 
    d.forEach(function(val, ind, tab) { 
     for (let k = ind + 1; k < tab.length; k++) { 
      while ((i = networkMatrix.person1.indexOf(val, i + 1)) != -1) { 
       while ((j = networkMatrix.person2.indexOf(tab[k], j + 1)) != -1) { 
        if (i === j) { 
         networkMatrix.score[i]++; 
        } 
       } 
      } 
     } 
    }) 
}); 

はjsfiddleです。

enter image description here

このような感触は、このような単純なタスクのためのwaaaaayあまりにも複雑になっている場合は、誰かが私にどのようにいくつかの指標にを与えることができる:しかし、それは、多かれ少なかれ自分のコンピュータ上で動作しますが、私はなぜ知りませんこの混乱から抜け出す?

+0

グループの任意の数をそのためES6 Mapを使用するか、または他のプレーンオブジェクトだろうか?あなたのデモにはタイプミスがあることにご注意ください – charlietfl

+0

グループの数はいくつでも、おそらく1-100の間です。私はタイプミスを修正します。 –

+0

「スコア」とは何ですか? – charlietfl

答えて

0

次のようにあなたはそれを行うことができます:

  • をソースがソースをキーマップ、およびターゲットをキーごとに、ネストされたマップを、ビルド・ターゲット
  • よりもアルファベット順で小さいところのみ名のペアを考えますこれらのネストされたキーにカウンタを割り当てます。あなたは

const groupes = [ 
 
     ["John", "Dylan", "Brian"], 
 
     ["Dylan", "Brian"], 
 
     ["John", "Kate"] 
 
    ], 
 
    // Get unique list of names 
 
    names = [...new Set([].concat(...groupes))], 
 
    // Create a 2D-map with a counter set to zero 
 
    map = new Map(names.map(name => [name, new Map(names.map(name2 => [name2, 0]))])), 
 
    result = []; 
 

 
// Count the pairs 
 
for (const groupe of groupes) { 
 
    for (const source of groupe) { 
 
     const targetMap = map.get(source); 
 
     for (const target of groupe) { 
 
      if (source < target) targetMap.set(target, targetMap.get(target)+1); 
 
     } 
 
    } 
 
} 
 

 
// Convert nested maps to result structure 
 
for (const [source, targetMap] of map.entries()) { 
 
    for (const [target, weight] of targetMap.entries()) { 
 
     if (weight) result.push({source, target, weight}); 
 
    } 
 
} 
 

 
console.log(result); 
.as-console-wrapper { max-height: 100% !important; top: 0; }

関連する問題