R语言如何将3列长格式数据转换为1000个8性状上/下三角矩阵
R语言实现3列数据框批量转三角矩阵并存入列表
实现逻辑
首先验证数据量匹配规则:
- 8行8列的三角矩阵(含对角线)共需要
8*(8+1)/2 = 36个填充值 - 输入数据框每行有3个值,单个矩阵对应
36/3 = 12行原始数据 - 12000行原始数据刚好可以拆分为
12000/12 = 1000组,完全符合需求
填充规则:按数据框行优先的顺序读取值,依次填充到矩阵的三角位置,可自由选择下三角/上三角填充。
完整实现代码
# 假设你的原始3列数据框名为df,以下代码先模拟了一份示例数据,实际使用时替换为你自己的df即可 df <- data.frame( col1 = sample(1:10, 12000, replace = TRUE), col2 = sample(1:10, 12000, replace = TRUE), col3 = sample(1:10, 12000, replace = TRUE) ) # 步骤1:按行优先把所有值展开为长向量 all_vals <- as.vector(t(df)) # 步骤2:把长向量拆分为1000个长度为36的子向量,每个对应一个矩阵的填充值 val_groups <- split(all_vals, rep(1:1000, each = 36)) # 步骤3:批量生成三角矩阵存入列表 mat_list <- lapply(val_groups, function(x) { # 初始化8x8空矩阵,配置行名列名为trait1~trait8,不需要可以删掉dimnames参数 mat <- matrix(NA, nrow = 8, ncol = 8, dimnames = list(paste0("trait", 1:8), paste0("trait", 1:8))) # 填充下三角(含对角线),如果需要上三角填充,把lower.tri改为upper.tri即可 mat[lower.tri(mat, diag = TRUE)] <- x return(mat) }) # 查看第一个矩阵验证结果 print(mat_list[[1]])
可选调整项
如果需要严格按行优先的顺序填充三角位置,可替换步骤3中的赋值逻辑:
mat_list <- lapply(val_groups, function(x) { mat <- matrix(NA, nrow = 8, ncol = 8, dimnames = list(paste0("trait", 1:8), paste0("trait", 1:8))) temp_x <- x for (i in 1:8) { mat[i, 1:i] <- temp_x[1:i] temp_x <- temp_x[-(1:i)] } return(mat) })
内容的提问来源于stack exchange,提问作者BMT
相关产品推荐
相关产品推荐

