2015-01-09 29 views
3

假設我有一個R數據集,指示國際組織中各個國家的成員資格(原始數據集可在此找到:IGO_stateunit_v2.3.zip)。在R計算共享成員中創建連接矩陣

下面是數據的基本結構的例子:

​​

所以數據是這樣的,其中1 =成員組織:

cntr UNO APEC ASEAN 
A 0 0  0 
B 1 0  0 
C 1 0  0 
D 1 0  0 
E 1 1  1 
F 1 1  1 
G 1 1  0 
H 1 0  0 
I 1 0  0 
J 1 0  0 

我想在R中創建這些數據是一個矩陣,用於計算兩個國家共享的成員數量。結果應該是這樣的:

cntr A B C D E F G H I J 
    A 0 0 0 0 0 0 0 0 0 0 
    B 0 0 1 1 1 1 1 1 1 1 
    C 0 1 0 1 1 1 1 1 1 1 
    D 0 1 1 0 1 1 1 1 1 1 
    E 0 1 1 1 0 3 2 1 1 1 
    F 0 1 1 1 3 0 2 1 1 1 
    G 0 1 1 1 2 2 0 1 1 1 
    H 0 1 1 1 1 1 1 0 1 1 
    I 0 1 1 1 1 1 1 1 0 1 
    J 0 1 1 1 1 1 1 1 1 0 

有沒有人有想法如何計算連接矩陣?幫助將不勝感激!

+2

看一看'tcrossprod' – akrun

回答

6

您的數據:

d <- structure(list(cntr = structure(1:10, .Label = c("A", "B", "C", 
"D", "E", "F", "G", "H", "I", "J"), class = "factor"), UNO = c(0L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), APEC = c(0L, 0L, 0L, 0L, 
1L, 1L, 1L, 0L, 0L, 0L), ASEAN = c(0L, 0L, 0L, 0L, 1L, 1L, 0L, 
0L, 0L, 0L)), .Names = c("cntr", "UNO", "APEC", "ASEAN"), class = "data.frame", row.names = c(NA, 
-10L)) 

解決方案:

m <- as.matrix(d[,-1]) 
    m2 <- m %*% t(m) 
    # Alternatively, m2 <- tcrossprod(m) can be used with the same result (thanks to @akrun for pointing that out)! 
    diag(m2) <- 0 
    dimnames(m2) <- list(LETTERS[1:10],LETTERS[1:10]) 
    m2 
    # A B C D E F G H I J 
    # A 0 0 0 0 0 0 0 0 0 0 
    # B 0 0 1 1 1 1 1 1 1 1 
    # C 0 1 0 1 1 1 1 1 1 1 
    # D 0 1 1 0 1 1 1 1 1 1 
    # E 0 1 1 1 0 3 2 1 1 1 
    # F 0 1 1 1 3 0 2 1 1 1 
    # G 0 1 1 1 2 2 0 1 1 1 
    # H 0 1 1 1 1 1 1 0 1 1 
    # I 0 1 1 1 1 1 1 1 0 1 
    # J 0 1 1 1 1 1 1 1 1 0 

編輯:稍微緊湊的解決方案:

rownames(d) <- d$cntr 
    m <- tcrossprod(as.matrix(d[,-1])) 
    diag(m) <- 0 
    m 
+0

非常感謝了提示幫助! – jsts