varias - vectores en r




Matriz de interacción por pares en R (2)

En el campo de la teoría de grafos, lo que estás buscando es una matriz de adyacencia :

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

Estoy tratando de calcular una matriz por pares en R que cuenta el número de veces que los individuos interactúan con otras personas (por lo que la matriz incluirá N número de filas y columnas correspondientes a la cantidad 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 el individuo X actúa en Y más el número de veces que Y actúa sobre X. Idealmente, el marco de datos anterior debería dar una matriz que se parece a esto :

     DOL JOJ NOR NIN
DOL    0   2   3   1
JOJ    2   0   2   0
NOR    3   2   0   2
NIN    1   0   2   0

Empecé a escribir un ciclo para recorrer cada individuo en mi conjunto de datos y contar sus interacciones tanto de actor-> socio y socio-> actor. Estoy seguro de que esto funcionaría, pero no es ideal ya que el conjunto de datos completo es bastante grande. ¿Hay una mejor manera?

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]

La table() la Base R table() te proporcionará lo que buscas:

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