-5

私は、個人の関係のレベルを計算するために、セッションでの個人の発生を合計するより速い方法を見つけようとしています。基本的には、2人ごとに、少なくとも1人が観察された回数を数えたいと思います。私はここでメルトとキャストを含む答えを調べましたが、それらを使用する良い方法を見つけられませんでした。これは私の非効率的なコードです:

presence=array(0,c(8,10)) #  session by individual
counter=array(0,c(10,10))
# put some data into the array:
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    0    1    0    0    0    0    0    0    0     0
 [2,]    0    0    1    1    1    1    0    0    0     0
 [3,]    0    0    0    0    0    0    1    0    0     0
 [4,]    0    0    0    0    0    0    0    1    0     0
 [5,]    0    0    0    0    0    0    0    1    0     0
 [6,]    0    0    0    0    0    0    0    0    1     0
 [7,]    0    0    0    0    0    0    0    0    1     0
 [8,]    0    0    1    0    1    1    0    0    0     1


  for (a in 1:10){
    for (b in 1:10){
      for (c in 1:8) {
        if ((presence[c,a]>0)|(presence[c,b]>0)) counter[a,b]=counter[a,b]+1
        # calculate something using this counter for each two individuals a and b
      }
    }
  }

ご協力ありがとうございました。アミヤル

4

1 に答える 1

0

わかりました。まだ完全には明確ではありませんが、プレゼンスは隣接行列になり、列はユーザ​​ーを表し、行はイベントを表すためpresence[i,j]、ユーザーiがイベントjに参加したことを示していると思います。

私がそれを正しく解釈しているなら、カウントは共起行列のようですよね? count[i,j]ユーザーiとjが一緒に参加したイベントの数を記録する必要がありますか?

2モードのソーシャルネットワーク分析に関する文献、特にアフィリエーションネットワークを調べると、これを直接計算できます。

count = t(presence)%*%presence

今、私はそれが正確であることを確認するためにあなた自身のデータでそれをチェックします:カウントでランダムにいくつかのセルをチェックし、それらを存在と比較するだけです。

また、余談ですが、これらの種類のマトリックスでは、行は従来はユーザーであり、イベントは列です。

編集:代わりに、ユーザーが参加したイベントの数(両方が参加したイベントの数ではなく)をカウントしたい場合は、交差点ではなく結合です。つまり、ユーザーが参加したイベントの数+ユーザーjが参加したイベントの数-交差点

x = t(presence)%*%presence
numEvents = diag(x)
counts = matrix(rep(numEvents,dim(x)[1]),nrow=dim(x)[1],byrow=TRUE)+matrix(rep(numEvents,dim(x)[1]),nrow=dim(x)[1],byrow=FALSE)-x

これは最も洗練されたソリューションではありませんが、機能するはずです

于 2013-03-04T21:38:48.423 に答える