我的问题,删除特定用途,似乎是这样的:如何转换这样的组合:首先用于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名称的元素将具有零值,而其他元素对应于上述值
这是一种有效的方法:
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)
同样,如果必须多次执行,我会将其包装在一个函数中。