在R中,如何使用combin检索完整的矩阵?

Cae*_*sar 4 r matrix

我的问题,删除特定用途,似乎是这样的:如何转换这样的组合:首先用于combn(letters[1:4], 2)计算组合

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,] "a"  "a"  "a"  "b"  "b"  "c" 
[2,] "b"  "c"  "d"  "c"  "d"  "d" 
Run Code Online (Sandbox Code Playgroud)

使用每一列获取另一个数据帧:

   [,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1    2    3    4   5     6
Run Code Online (Sandbox Code Playgroud)

元素,例如:从上述数据框的第一列中获得的第一个元素

然后如何将上述数据框转换为矩阵,例如结果,例如:

   a   b   c  d
a  0   1   2  3
b  1   0   4  5
c  2   4   0  6
d  3   5   6  0
Run Code Online (Sandbox Code Playgroud)

具有相同col和row名称的元素将具有零值,而其他元素对应于上述值

Rei*_*son 5

这是一种有效的方法:

inputs <- letters[1:4]
combs <- combn(inputs, 2)
N <- seq_len(ncol(combs))
nams <- unique(as.vector(combs))
out <- matrix(ncol = length(nams), nrow = length(nams))
out[lower.tri(out)] <- N
out <- t(out)
out[lower.tri(out)] <- N
out <- t(out)
diag(out) <- 0
rownames(out) <- colnames(out) <- inputs
Run Code Online (Sandbox Code Playgroud)

这使:

> out
  a b c d
a 0 1 2 3
b 1 0 4 5
c 2 4 0 6
d 3 5 6 0
Run Code Online (Sandbox Code Playgroud)

如果必须要做很多,可以将这些函数调用包装到一个函数中。

另一种选择是通过手动as.matrix.dist()设置"dist"对象来为我们进行转换。使用之前的一些对象:

## Far easier
out2 <- N
class(out2) <- "dist"
attr(out2, "Labels") <- as.character(inputs)
attr(out2, "Size") <- length(inputs)
attr(out2, "Diag") <- attr(out2, "Upper") <- FALSE
out2 <- as.matrix(out2)
Run Code Online (Sandbox Code Playgroud)

这使:

> out2
  a b c d
a 0 1 2 3
b 1 0 4 5
c 2 4 0 6
d 3 5 6 0
Run Code Online (Sandbox Code Playgroud)

同样,如果必须多次执行,我会将其包装在一个函数中。