2012-10-19 45 views
7

Tôi đang cố tính toán ma trận theo cặp trong R đếm số lần các cá nhân tương tác với các cá nhân khác (vì vậy ma trận sẽ bao gồm N số hàng và cột tương ứng với số lượng cá nhân). Tôi có một khung dữ liệu liệt kê "diễn viên" và "đối tác" trong các cột riêng biệt.Ma trận tương tác hai chiều trong R

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')) 

Các dữ liệu là như vậy mà chỉ đạo của sự tương tác là không thích hợp, vì vậy mỗi tế bào nên đếm số lần hành vi X cá nhân trên Y cộng với số lần Y tác động lên X. Một cách lý tưởng, khung dữ liệu nên trên cung cấp cho một ma trận mà trông như thế này:

 DOL JOJ NOR NIN 
DOL 0 2 3 1 
JOJ 2 0 2 0 
NOR 3 2 0 2 
NIN 1 0 2 0 

tôi bắt đầu viết một vòng lặp để lướt qua từng cá nhân trong tập dữ liệu của tôi và để đếm của ông/bà tương tác cả từ actor-> đối tác và partner-> diễn viên. Tôi chắc chắn điều này sẽ hoạt động, nhưng không lý tưởng vì tập dữ liệu đầy đủ là khá lớn. Có cách nào tốt hơn?


Cập nhật: Cám ơn các câu trả lời! Cả hai giải pháp đều hoạt động tốt! Tôi đăng bài thực hiện đề xuất của Josh, điều này rất hữu ích.

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] 

Trả lời

6

cơ sở R của table() sẽ giúp bạn có được những gì bạn đang sau:

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 
+0

Gọn gàng, vì vậy đây thực chất là 'với (nn, bảng (diễn viên, đối tác) + bảng (đối tác, diễn viên))' đúng không? – thelatemail

+0

Cảm ơn giải pháp này! Tôi nhận thấy rằng điều này không hoạt động nếu bảng được chuyển đổi không chia sẻ cùng tên hàng và cột giống với tên gốc, điều này có thể xảy ra nếu các tương tác nhất định chỉ xuất hiện theo một hướng. Tôi nhận được xung quanh điều này bằng cách tạo ra một ma trận tổng thể với tất cả các cá nhân có thể, sau đó sử dụng các chỉ số để chỉ tập hợp các hàng và cột phù hợp trước khi thêm. Tôi đã tính toán các chỉ số như vậy (một cho cả hai bảng ban đầu và transposed) 'i <- as.matrix (expand.grid (rownames (x), colnames (x)))' – boon

5

Trong lĩnh vực lý thuyết đồ thị, những gì bạn đang tìm kiếm là một ma trận kề:

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 
+0

Điều này thật hoàn hảo. Cảm ơn bạn rất nhiều - bạn đã cứu tôi rất nhiều thời gian! – boon

+2

+1 để gắn kết điều này với tên có thể tìm kiếm được. –

+0

@ JoshO'Brien làm thế nào để bạn chọn yếu tố từ ma trận này? – andi