個人が他の個人とやり取りする回数をカウントするRのペアワイズマトリックスを計算しようとしています(したがって、マトリックスには、個人の数に対応するN個の行と列が含まれます)。「アクター」と「パートナー」を別々の列にリストするデータフレームがあります。
nn <- data.frame(actors=c('DOL','DOL','DOL','DOL','DOL','NOR','NOR','NOR','NIN','JOJ'),partners=c('JOJ','JOJ','NOR','NOR','NIN','NIN','DOL','JOJ','NOR','NOR'))
データは相互作用の方向が無関係であるため、各セルは、個々の X が Y に作用する回数と、Y が X に作用する回数を足した回数をカウントする必要があります。理想的には、上記のデータ フレームは、次のような行列を与える必要があります。 :
DOL JOJ NOR NIN
DOL 0 2 3 1
JOJ 2 0 2 0
NOR 3 2 0 2
NIN 1 0 2 0
データセット内の各個人を循環し、俳優 -> パートナーおよびパートナー -> 俳優の両方の相互作用をカウントするループを書き始めました。これでうまくいくと確信していますが、完全なデータセットが非常に大きいため、理想的ではありません。より良い方法はありますか?
更新: 返信ありがとうございます! どちらのソリューションもうまく機能します。Josh の提案の実装を投稿しています。これは非常に役に立ちました。
x <- with(nn, table(actors, partners))
y <- t(x)
# unique individuals
u <- unique(c(rownames(x),colnames(x)))
m <- matrix(0,ncol=length(u),nrow=length(u),dimnames=list(u,u))
i1 <- as.matrix(expand.grid(rownames(x),colnames(x)))
i2 <- as.matrix(expand.grid(rownames(y),colnames(y)))
m[i1] <- x[i1]
m[i2] <- m[i2] + y[i2]