2015-01-09 4 views
3

국제기구의 국가 회원 자격을 나타내는 R 데이터 집합이 있다고 가정합니다 (원래 데이터 집합은 IGO_stateunit_v2.3.zip입니다). 여기 R에 공유 행렬을 계산하는 연결 행렬을 만듭니다.

데이터의 기본 구조에 대한 예입니다

그래서 데이터는 다음과 같습니다
cntr <- c('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J') 
UNO <- c(0, 1, 1, 1, 1, 1, 1, 1, 1, 1) 
APEC <- c(0, 0, 0, 0, 1, 1, 1, 0, 0, 0) 
ASEAN <- c(0, 0, 0, 0, 1, 1, 0, 0, 0, 0) 
data <- data.frame(cntr, UNO, APEC, ASEAN) 

, 조직의 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

관련 문제