首页 > 解决方案 > 将 3 列长格式转换为 1000 个上(或下)三角矩阵

问题描述

我想在 R 中转换一千个具有 8 个特征的上(或下)矩阵中的三个定义的列(数据框)。每个矩阵在数据框中逐行写出。这是一个例子:

Dataframe with 3 columns (and 12000 rows). From this I need to have 1000 matrices (triangular):
           col1  col2  col3
row1         1     2     3 
row2         2     3     4
row3         7     4     5
row4         1     4     5
row5         2     4     5
row6         3     4     5
.            .     .     .
.            .     .     . 
.            .     .     . 
row12000     1     6     9

我需要将它们转换为 1000 个矩阵(三角形),每个矩阵有 8 个特征,并将它们放在一个列表中:将数据框中的数据转换为第一个矩阵的示例:


            trait 1     trait2         trait3    trait4 trait5 trait6  trait7 trait8
trait1: 1(row1 col1)  
trait2: 2(row1 col2)  5(row3 col3)  
trait3: 3(row1 col3)  1(row4 col1)  3(row6 col1)  
trait4: 2(row2 col1)  4(row4 col2)  4(row6 col2)  value  
trait5: 3(row2 col3)  5(row4 col3)  5(row6 col3)  value  value 
trait6: 4(row2 col3)  2(row5 col1)  .             value  value  value 
trait7: 7(row3 col1)  4(row5 col2)  .             value  value  value  value  
trait8: 4(row3 col2)  5(row5 col3)  .             value  value  value  value  value 

标签: rlistmatrix

解决方案


  • 将矩阵值逐行折叠df为向量 ( all_values) 中的数据帧 ( ) 值。
  • 创建 36 个值的组并将它们拆分为列表。
  • 将 36 个值中的每一个放入 8 X 8 的下三角矩阵中,并获取矩阵列表。
all_values <- c(t(df))
dummmy_matrix <- matrix(nrow = 8, ncol = 8, 
                 dimnames = list(paste0('trait', 1:8), paste0('trait', 1:8)))

matrix_list <- lapply(split(all_values, ceiling(seq_along(all_values)/36)), function(x) {
  dummmy_matrix[lower.tri(dummmy_matrix, diag = TRUE)] <- x
  dummmy_matrix
})
matrix_list

推荐阅读