将命名向量转换为 R 中的对称矩阵?

Ele*_*ino 3 r matrix

已经提出了类似的问题,但是,没有一个问题需要分割向量名称,所以我提出了一个新问题。

我正在尝试将命名向量转换为 R 中的对称矩阵。我的向量包含矩阵中每个值组合的名称。所以我需要将名称分成各个组成部分。

例如,如果我的数据如下所示:

v <- c(
  "x1 x2" = 0.81899860,
  "x1 x3" = 0.10764701,
  "x2 x3" = 0.03923967,
  "x1 x4" = 0.03457240,
  "x2 x4" = 0.05954789,
  "x3 x4" = 0.15535316,
  "x1 x5" = 0.04041266,
  "x2 x5" = 0.05421003,
  "x3 x5" = 0.09198977,
  "x4 x5" = 0.15301872
)
Run Code Online (Sandbox Code Playgroud)

我们可以看到每个名称都是 2 个变量的组合。我试图将其转换为对称矩阵(对角线为零)。为了清楚起见,我想要的输出如下:

           x1         x2         x3         x4         x5
x1 0.00000000 0.81899860 0.10764701 0.03457240 0.04041266
x2 0.81899860 0.00000000 0.03923967 0.05954789 0.05421003
x3 0.10764701 0.03923967 0.00000000 0.15535316 0.09198977
x4 0.03457240 0.05954789 0.15535316 0.00000000 0.15301872
x5 0.04041266 0.05421003 0.09198977 0.15301872 0.00000000
Run Code Online (Sandbox Code Playgroud)

关于我如何做到这一点有什么建议吗?

编辑

由于其中一个答案强调我的问题太模糊,因此我进行了编辑以反映这一点。我正在寻找这个问题的通用解决方案,无论向量中的名称是什么。例如,我的命名向量可能如下所示:

v <- c(
  "apple banana" = 0.81899860,
  "apple orange" = 0.10764701,
  "banana orange" = 0.03923967,
  "apple pear" = 0.03457240,
  "banana pear" = 0.05954789,
  "orange pear" = 0.15535316,
  "apple plum" = 0.04041266,
  "banana plum" = 0.05421003,
  "orange plum" = 0.09198977,
  "pear plum" = 0.15301872
)
Run Code Online (Sandbox Code Playgroud)

Tho*_*ing 5

一个选项igraph

library(igraph)

cbind(read.table(text = names(v)), v) %>%
  graph_from_data_frame(directed = FALSE) %>%
  get.adjacency(attr = "v", sparse = FALSE)
Run Code Online (Sandbox Code Playgroud)

给出

           x1         x2         x3         x4         x5
x1 0.00000000 0.81899860 0.10764701 0.03457240 0.04041266
x2 0.81899860 0.00000000 0.03923967 0.05954789 0.05421003
x3 0.10764701 0.03923967 0.00000000 0.15535316 0.09198977
x4 0.03457240 0.05954789 0.15535316 0.00000000 0.15301872
x5 0.04041266 0.05421003 0.09198977 0.15301872 0.00000000
Run Code Online (Sandbox Code Playgroud)

基础 R 选项

> d <- read.table(text = names(v))

> xtabs(v ~ ., cbind(rbind(d, setNames(rev(d), names(d))), v = rep(v, 2)))
    V2
V1           x1         x2         x3         x4         x5
  x1 0.00000000 0.81899860 0.10764701 0.03457240 0.04041266
  x2 0.81899860 0.00000000 0.03923967 0.05954789 0.05421003
  x3 0.10764701 0.03923967 0.00000000 0.15535316 0.09198977
  x4 0.03457240 0.05954789 0.15535316 0.00000000 0.15301872
  x5 0.04041266 0.05421003 0.09198977 0.15301872 0.00000000
Run Code Online (Sandbox Code Playgroud)