Матрица парного взаимодействия в R

Я пытаюсь вычислить попарно матрицу в 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

Я начал писать цикл, чтобы циклически проходить по каждому человеку в моем наборе данных и подсчитывать его / ее взаимодействия как от актера - партнера, так и от партнера -> актера. Я уверен, что это будет работать, но не идеально, так как полный набор данных довольно большой. Есть ли способ лучше?

Обновление: спасибо за ответы! Оба решения отлично работают! Я публикую свою реализацию предложения Джоша, что было очень полезно.

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]

Ответы на вопрос(2)

В области теории графов вы ищетематрица смежности:

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
 Josh O'Brien19 окт. 2012 г., 03:23
+1 за соединение с поисковым именем.
 andilabs18 сент. 2013 г., 17:49
@ JoshO'Brien, как ты выбираешь элемент из этой матрицы?
 boon19 окт. 2012 г., 02:32
Это потрясающе. Большое вам спасибо - вы сэкономили мне кучу времени!
Решение Вопроса

База 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
 thelatemail19 окт. 2012 г., 05:05
Аккуратно, так что это по сутиwith(nn,table(actors,partners) + table(partners,actors)) правильно?
 boon19 окт. 2012 г., 05:12
Спасибо за это решение! Я заметил, что это не работает, если транспонированная таблица не имеет те же имена строк и столбцов, что и оригинал, что может произойти, если определенные взаимодействия появляются только в одном направлении. Я справился с этим, создав мастер-матрицу со всеми возможными индивидуумами, а затем использовал индексы для поднабора только тех строк и столбцов, которые соответствовали перед добавлением. Я рассчитал индексы примерно так (один для исходной и транспонированной таблиц)i <- as.matrix(expand.grid(rownames(x),colnames(x)))

Ваш ответ на вопрос