R:通过重新编码 x 将具有变量 "country" 和 "x" 的数据集转换为邻接矩阵

R: Transforming a dataset with the variables "country" and "x" to an adjacency matrix by recoding x

假设我在 R 中有以下数据集 CL:

country    x
USA        7
Canada     7
Bahamas    6
Cuba       1
Haiti      2

现在,我打算做的是创建一个邻接矩阵,其中国家是节点,联系的强度是 x 值的绝对差值。例如,巴哈马 (x=6) 和古巴 (x=1) 之间的关系强度为 6-1=5

因此,此处的网络矩阵如下所示:

country USA Canada Bahamas Cuba Haiti
USA      0    0       -1    -6    -5
Canada   0    0       -1    -6    -5
Bahamas  1    1        0    -5    -4
Cuba     6    6        5     0     4
Haiti    5    5        4    -1     0

我已经为这个问题苦苦挣扎了很长时间,我只是想不出一个好的方法来解决这个问题。我的实际数据集包含150个国家,所以在Excel中这样做真的很麻烦。那么,有人知道如何在 R 中执行此操作吗?非常感谢!

这里是复制的R代码:

country<- c("USA", "Canada", "Bahamas", "Cuba", "Haiti")
x<- c(7,7,6,1,2)

CL<- data.frame(country=country, x=x)

您可以在 base R:

中使用 dist 函数
dist_mat = as.matrix(dist(CL$x, diag = TRUE, upper = TRUE))

dist_mat[upper.tri(dist_mat)] = -dist_mat[upper.tri(dist_mat)]

dimnames(dist_mat) = list(country, country)

结果:

        USA Canada Bahamas Cuba Haiti
USA       0      0      -1   -6    -5
Canada    0      0      -1   -6    -5
Bahamas   1      1       0   -5    -4
Cuba      6      6       5    0    -1
Haiti     5      5       4    1     0

请注意 Cuba <-> Haiti 关系实际上是不正确的,因为 dist returns 绝对距离。要解决这个问题,您可以使用以下方法:

dist_mat2 = -(outer(x, x, "-"))

dimnames(dist_mat2) = list(country, country)

结果:

        USA Canada Bahamas Cuba Haiti
USA       0      0      -1   -6    -5
Canada    0      0      -1   -6    -5
Bahamas   1      1       0   -5    -4
Cuba      6      6       5    0     1
Haiti     5      5       4   -1     0

相当于dist方法,也可以使用:

dist_mat = abs(outer(x, x, "-"))
grid <- expand.grid(x, x)
grid$strength <- grid$Var1 - grid$Var2
mat <- matrix(grid$strength, nrow=5, ncol=5, byrow=TRUE)