7

個人が他の個人とやり取りする回数をカウントする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]
4

2 に答える 2

7

ベースRtable()は、あなたが求めているものを手に入れます:

x <- with(nn, table(actors, partners))
x + t(x)
#       partners
# actors DOL JOJ NIN NOR
#    DOL   0   2   1   3
#    JOJ   2   0   0   2
#    NIN   1   0   0   2
#    NOR   3   2   2   0
于 2012-10-19T01:21:13.620 に答える
6

グラフ理論の分野では、探しているのは隣接行列です。

library(igraph)
g <- graph.edgelist(as.matrix(nn), directed = FALSE)
get.adjacency(g)
#     DOL JOJ NOR NIN
# DOL   0   2   3   1
# JOJ   2   0   2   0
# NOR   3   2   0   2
# NIN   1   0   2   0
于 2012-10-19T00:28:12.067 に答える