在 R 中创建连接矩阵以计算共享成员资格
Create a connectivity matrix in R counting shared membership
假设我在 R 中有一个数据集,指示国家在国际组织中的成员资格(原始数据集可在此处找到:IGO_stateunit_v2.3.zip)。
这是数据基本结构的示例:
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
有人知道如何计算连接矩阵吗?将不胜感激!
您的数据:
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
假设我在 R 中有一个数据集,指示国家在国际组织中的成员资格(原始数据集可在此处找到:IGO_stateunit_v2.3.zip)。
这是数据基本结构的示例:
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
有人知道如何计算连接矩阵吗?将不胜感激!
您的数据:
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