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