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

我开始编写一个循环来循环遍历我的数据集中的每个人,并计算他/她从 actor->partner 和 partner->actor 的交互。我确信这会起作用,但并不理想,因为完整的数据集非常大。有没有更好的办法?


更新:感谢您的回复!两种解决方案都很好用!我正在发布我对 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

Base 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 回答