2016-12-29 23 views
0

的SNA創建鄰接矩陣我想創建一個鄰接矩陣中的社會網絡分析(可能與IGRAPH graph_from_adjacency_matrix)使用從結構像這樣(但更大)一個CSV:從數據框中

name vote1 vote2 vote3 
Joe 1  0  1 
Jane 0  0  1 
Jill 1  0  1 

對於網絡分析,節點將是名稱變量,節點將通過它們一起投票的頻率(1或0)進行連接。喜歡的東西:

Joe Jane Jill 
Joe 0 2 3 
Jane 2 0 2 
Jill 3 2 0 

像這樣簡單看來,我一直沒能到這個數據幀成功地轉換爲可用於創建的igraph圖形對象的鄰接矩陣。 as.matrix和data.matrix會將其轉換爲矩陣,但不是鄰接矩陣,也不是保留「name」變量中的字符的矩陣。我的矩陣代數不強,所以我知道我很可能錯過了一些明顯的東西,但我不知道它是什麼。我願意接受其他解決方案,這些解決方案讓我達到了網絡分析的最終目標。

回答

4

我想你想要一些交叉產品的版本。

# construct the matrix 
myMat <- as.matrix(df[-1]) 

# same output as myMat %*% t(myMat) 
resultMat <- tcrossprod(myMat) 
# add names 
dimnames(resultMat) <- list(df$name, df$name) 

resultMat 
    Joe Jane Jill 
Joe 2 1 2 
Jane 1 1 1 
Jill 2 1 2 

關閉對角線顯示了個人投票的同時和對角線給出的個人多少次自己(即,其總的投票)投票計數實例計數。

既然你不想每個人的總投票數,你可以用0代替對角線。

# remove diagonal 
diag(resultMat) <- 0 

resultMat 
    Joe Jane Jill 
Joe 0 1 2 
Jane 1 0 1 
Jill 2 1 0 

增加兩個額外的票,並在下面DF1兩個額外的選民。有一位名叫薩爾的選民只投了一票2,是唯一的選民。

df1 
name vote1 vote2 vote3 vote4 vote5 
1 Joe  1  0  1  0  1 
2 Jane  0  0  1  1  0 
3 Jill  1  0  1  1  0 
4 Bob  1  0  1  1  0 
5 Sal  0  1  0  0  0 

通過上述過程與此更大的矩陣運行,我們得到

resultMat 
    Joe Jane Jill Bob Sal 
Joe 0 1 2 2 0 
Jane 1 0 2 2 0 
Jill 2 2 0 3 0 
Bob 2 2 3 0 0 
Sal 0 0 0 0 0 

這都說明在所有薩爾的插槽和3S鮑勃 - 吉爾吉爾 - 鮑勃插槽0,因爲它們都在投相同的3票。

數據

df <- 
structure(list(name = structure(c(3L, 1L, 2L), .Label = c("Jane", 
"Jill", "Joe"), class = "factor"), vote1 = c(1L, 0L, 1L), vote2 = c(0L, 
0L, 0L), vote3 = c(1L, 1L, 1L)), .Names = c("name", "vote1", 
"vote2", "vote3"), class = "data.frame", row.names = c(NA, -3L)) 

df1 <- 
structure(list(name = structure(c(4L, 2L, 3L, 1L, 5L), .Label = c("Bob", 
"Jane", "Jill", "Joe", "Sal"), class = "factor"), vote1 = c(1L, 
0L, 1L, 1L, 0L), vote2 = c(0L, 0L, 0L, 0L, 1L), vote3 = c(1L, 
1L, 1L, 1L, 0L), vote4 = c(0L, 1L, 1L, 1L, 0L), vote5 = c(1L, 
0L, 0L, 0L, 0L)), .Names = c("name", "vote1", "vote2", "vote3", 
"vote4", "vote5"), class = "data.frame", row.names = c(NA, -5L)) 
+0

這正是我需要的。我最終使用'data.matrix'而不是'as.matrix',但這是唯一的修改。 –

+0

不錯。我忘了那個功能。很好的發現。 – lmo