r - 在 R 中创建连接矩阵以计算共享成员资格

标签 r matrix connectivity

假设我在 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 - 在 R 中创建连接矩阵以计算共享成员资格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27864085/

相关文章:

r - 如何删除 R 中匹配模式或分隔符之前的第一项和最后一项

r - 对于 i 循环,调用不同的数据帧

r - data.table 按引用分配的标准形式和函数形式的结果不同 `:=`

android - 按钮矩阵,如安全模式面板

hardware - 如何通过与计算机的实时连接来模拟/伪造/模仿 SD 卡?

java - 如何使用 java 检查数据库连接是关闭还是打开?

r - 如何在R中使用dplyr获取最近三个月的数据

algorithm - 使用 n 个标签标记网格,其中每个标签都与其他每个标签相邻

matlab - MATLAB 中的逐元素矩阵复制

java - 无法从后台服务通过 WiFi 访问互联网