Вот еще один подход с использованием базы R:
- Извлечение подматрицы ковариаций для каждого отдельного транспортного средства;
- Расширение этой подматрицы в вектор;
- Объединить векторы (строки) обратно в матрицу.
Дополнительный код должен получить правильные имена столбцов для final_need
, основанные на соединении комбинаций префиксов.
## sort row + colnames in alphabetical order
cov_mat <- cov_mat[sort(rownames(cov_mat)), sort(colnames(cov_mat))]
## unique prefix and vehicle names
prefix <- unique(sub("_\\w+$", "", colnames(cov_mat)))
vehicNames <- unique(sub("^\\w+?_", "", colnames(cov_mat)))
## create final_need
final_need <- t(sapply(vehicNames, function(vehic) {
indices <- grep(vehic, colnames(cov_mat))
as.vector(cov_mat[indices, indices])
}))
## add prefix combinations as column names
colnames(final_need) <- levels(interaction(prefix, prefix, sep = ""))
final_need
#> aa ba ca ab bb cb ac bc cc
#> boat 2.636 -0.420 1.668 -0.420 1.043 -0.361 1.668 -0.361 2.290
#> plane 4.419 0.018 -0.954 0.018 2.498 -0.465 -0.954 -0.465 1.791
#> train 2.668 1.040 0.806 1.040 4.153 1.922 0.806 1.922 4.097
РЕДАКТИРОВАТЬ: та же самая банкасделать наоборот, т.е. извлечь подматрицу ковариаций для каждой комбинации префиксов и объединить их диагонали обратно в матрицу (по столбцу).
## create final_need by column
final_need <- apply(expand.grid(prefix, prefix), 1, function(i) {
row_ids <- grep(sprintf("^%s_", i[1]), rownames(cov_mat))
col_ids <- grep(sprintf("^%s_", i[2]), colnames(cov_mat))
cov_mat[cbind(row_ids, col_ids)]
})
## add row + column names
dimnames(final_need) <- list(vehicNames, levels(interaction(prefix, prefix, sep = "")))
final_need
#> aa ba ca ab bb cb ac bc cc
#> boat 2.636 -0.420 1.668 -0.420 1.043 -0.361 1.668 -0.361 2.290
#> plane 4.419 0.018 -0.954 0.018 2.498 -0.465 -0.954 -0.465 1.791
#> train 2.668 1.040 0.806 1.040 4.153 1.922 0.806 1.922 4.097