从 R 中的数据帧(sparsematrix)构建单位矩阵

Build identity matrix from dataframe (sparsematrix) in R

我正在尝试从数据帧创建单位矩阵。数据框是这样的:


i<-c("South Korea", "South Korea", "France", "France","France")
j <-c("Rwanda", "France", "Rwanda", "South Korea","France")
distance <-c(10844.6822,9384,6003,9384,0)
dis_matrix<-data.frame(i,j,distance)

dis_matrix

1   South Korea     South Korea        0.0000
2   South Korea          Rwanda    10844.6822
3   South Korea          France     9384.1793
4        France          Rwanda     6003.3498
5        France     South Korea     9384.1793
6        France          France        0.0000

我正在尝试创建一个如下所示的矩阵:

                South Korea           France         Rwanda     
South Korea               0        9384.1793     10844.6822
France            9384.1793                0      6003.3498
Rwanda           10844.6822        6003.3498              0

我已尝试使用 Matrix 包中的 SparseMatrix,如此处所述 () 问题是 i 和 j 必须是整数,而我有字符串。我无法找到另一个功能来满足我的需求。我将不胜感激任何帮助。谢谢

我们可以将前两列转换为 factor,并将 levels 指定为两列的 unique 值,然后使用 [=16= 中的 xtabs ]

un1 <- unique(unlist(dis_matrix[1:2]))
dis_matrix[1:2] <- lapply(dis_matrix[1:2], factor, levels = un1)
xtabs(distance ~ i + j, dis_matrix)

-输出

           j
i             South Korea   France   Rwanda
  South Korea        0.00  9384.00 10844.68
  France          9384.00     0.00  6003.00
  Rwanda             0.00     0.00     0.00

可能的解决方案:

tidyr::pivot_wider(dis_matrix, id_cols = i, names_from = j,
         values_from = distance, values_fill = 0)

#> # A tibble: 2 × 4
#>   i           Rwanda France `South Korea`
#>   <chr>        <dbl>  <dbl>         <dbl>
#> 1 South Korea 10845.   9384             0
#> 2 France       6003       0          9384

您可以使用 igraph::get.adjacency 创建所需的矩阵。您还可以使用 sparse = TRUE.

创建稀疏矩阵
library(igraph)

g <- graph.data.frame(dis_matrix, directed = FALSE)
get.adjacency(g, attr="distance", sparse = FALSE)

            South Korea France   Rwanda
South Korea        0.00   9384 10844.68
France          9384.00      0  6003.00
Rwanda         10844.68   6003     0.00