簡體   English   中英

R中的成對交互矩陣

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM