这似乎有点啰嗦,但这里有一个小函数可以泛化到任何具有行名和列名的矩阵:
make_quadratic <- function(data)
{
names <- sort(unique(c(colnames(data), rownames(data))))
size <- length(names)
`colnames<-`(`rownames<-`(apply(apply(data, 1,
function(x) replace(numeric(size), names %in% colnames(data), x)), 1,
function(x) replace(numeric(size), names %in% rownames(data), x)),
names), names)
}
所以,例如:
make_quadratic(data)
#> A B C D E F
#> A 0.1033626 0.4390343 0 0.9368352 0 0.47888726
#> B 0.3897981 0.1563756 0 0.3148652 0 0.79636682
#> C 0.6780338 0.4937433 0 0.1325104 0 0.10266721
#> D 0.0000000 0.0000000 0 0.0000000 0 0.00000000
#> E 0.7667374 0.1198529 0 0.8930371 0 0.35349412
#> F 0.1467854 0.4649394 0 0.5838215 0 0.05615008
编辑
不包括循环的替代答案:
i <- as.matrix(expand.grid(row = which(LETTERS[1:6] %in% rownames(data)),
col = which(LETTERS[1:6] %in% colnames(data))))
result <- matrix(0, nrow = 6, ncol = 6,
dimnames = list(LETTERS[1:6], LETTERS[1:6]))
result[i] <- data
result
#> A B C D E F
#> A 0.1033626 0.4390343 0 0.9368352 0 0.47888726
#> B 0.3897981 0.1563756 0 0.3148652 0 0.79636682
#> C 0.6780338 0.4937433 0 0.1325104 0 0.10266721
#> D 0.0000000 0.0000000 0 0.0000000 0 0.00000000
#> E 0.7667374 0.1198529 0 0.8930371 0 0.35349412
#> F 0.1467854 0.4649394 0 0.5838215 0 0.05615008