Матрица парного взаимодействия в 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]