我正在尝试计算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'))
Run Code Online (Sandbox Code Playgroud)
数据是相互作用的方向是无关紧要的,因此每个单元格应计算单个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
Run Code Online (Sandbox Code Playgroud)
我开始编写一个循环来遍历我的数据集中的每个人,并计算他/她与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]
Run Code Online (Sandbox Code Playgroud)
Base R's table()将为您提供所需的服务:
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
Run Code Online (Sandbox Code Playgroud)
在图论领域,你正在寻找的是一个邻接矩阵:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3715 次 |
| 最近记录: |