gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:44:37 24 4
gpt4 key购买 nike

假设我在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com