在 R 中,如何从数据框(稀疏矩阵)构建单位矩阵?

5

我想从一个数据框创建一个单位矩阵。该数据框如下:


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

我已经尝试使用矩阵包中的SparseMatrix,就像这里描述的那样( 从数据框创建稀疏矩阵)。问题是i和j必须是整数,而我只有字符字符串。我找不到另一个可以满足我的要求的函数。感谢任何帮助。谢谢。

3个回答

4
一种可能的解决方案:
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

4
您可以使用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

1

我们可以将前两列转换为factor,并使用指定为来自两个列的unique值的levels,然后使用base R中的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

我认为你想要的是 unique(unlist(,而不是 unlist(unique( ... ? - Mikael Jagan
@MikaelJagan 你是对的。我把代码复制错了。 - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接