[英]Pairwise interaction matrix in 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
我開始編寫一個循環來遍歷我的數據集中的每個人,並計算他/她與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]
Base R的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
在圖論領域,你正在尋找的是一個鄰接矩陣 :
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.