Matriz de interacción por pares en R
Estoy tratando de calcular una matriz de pares en R que cuenta el número de veces que los individuos interactúan con otros individuos (por lo que la matriz incluirá N número de filas y columnas correspondientes al número de individuos). Tengo un marco de datos que enumera "actores" y "socios" en columnas separadas.
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'))
Los datos son tales que la dirección de la interacción es irrelevante, por lo que cada celda debe contar el número de veces que X actúa en Y más el número de veces que Y actúa en X. Idealmente, el marco de datos anterior debe dar una matriz como esta :
DOL JOJ NOR NIN
DOL 0 2 3 1
JOJ 2 0 2 0
NOR 3 2 0 2
NIN 1 0 2 0
Comencé a escribir un bucle para recorrer cada individuo en mi conjunto de datos y para contar sus interacciones tanto de actor-> socio como socio-> actor. Estoy seguro de que esto funcionaría, pero no es ideal ya que el conjunto de datos completo es bastante grande. ¿Hay alguna manera mejor?
Actualización: ¡Gracias por las respuestas! Ambas soluciones funcionan muy bien! Estoy publicando mi implementación de la sugerencia de Josh, que fue muy útil.
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]