如何在Relatedness Matrix中自动添加重复受试者
自动扩展亲缘关系矩阵:复制指定样本的关联模式
问题背景
我有如下的亲缘关系矩阵(Relatedness Matrix):
data <- (c(1,1,0.01,0.02,0.03,0.06, 1,1,0.01,0.02,0.03,0.06, 0.01,0.01,1,0.5,0.03,0.02, 0.02,0.02,0.5,1,0.02,0.03, 0.03,0.03,0.03,0.02,1,0.03, 0.06,0.06,0.02,0.03,0.03,1)) Matrix <- matrix(data, ncol = 6,nrow=6, byrow = FALSE) # 默认byrow=FALSE row.names(Matrix) <- c("1A", "1B", "2A", "2B", "3A", "3B") colnames(Matrix) <- c("1A", "1B", "2A", "2B", "3A", "3B") Matrix
输出矩阵:
1A 1B 2A 2B 3A 3B 1A 1.00 1.00 0.01 0.02 0.03 0.06 1B 1.00 1.00 0.01 0.02 0.03 0.06 2A 0.01 0.01 1.00 0.50 0.03 0.02 2B 0.02 0.02 0.50 1.00 0.02 0.03 3A 0.03 0.03 0.03 0.02 1.00 0.03 3B 0.06 0.06 0.02 0.03 0.03 1.00
我需要自动复制具有特定关联模式的样本(比如示例中的3B),命名为3C,最终得到如下矩阵:
data2 <- (c(1,1,0.01,0.02,0.03,0.06,0.06, 1,1,0.01,0.02,0.03,0.06,0.06, 0.01,0.01,1,0.5,0.03,0.02,0.02, 0.02,0.02,0.5,1,0.02,0.03,0.03, 0.03,0.03,0.03,0.02,1,0.03,0.03, 0.06,0.06,0.02,0.03,0.03,1,1, 0.06,0.06,0.02,0.03,0.03,1,1)) Matrix2 <- matrix(data2, ncol = 7,nrow=7, byrow = FALSE) # 默认byrow=FALSE row.names(Matrix2) <- c("1A", "1B", "2A", "2B", "3A", "3B", "3C") colnames(Matrix2) <- c("1A", "1B", "2A", "2B", "3A", "3B", "3C") Matrix2
输出结果:
1A 1B 2A 2B 3A 3B 3C 1A 1.00 1.00 0.01 0.02 0.03 0.06 0.06 1B 1.00 1.00 0.01 0.02 0.03 0.06 0.06 2A 0.01 0.01 1.00 0.50 0.03 0.02 0.02 2B 0.02 0.02 0.50 1.00 0.02 0.03 0.03 3A 0.03 0.03 0.03 0.02 1.00 0.03 0.03 3B 0.06 0.06 0.02 0.03 0.03 1.00 1.00 3C 0.06 0.06 0.02 0.03 0.03 1.00 1.00
请问能否实现这一自动操作?
解决方案
完全可以通过R代码自动实现,无需手动构造新向量,核心思路是提取目标样本的行/列数据,再扩展矩阵并添加新行、列及对角线值:
# 定义原矩阵(复用你的代码) data <- (c(1,1,0.01,0.02,0.03,0.06, 1,1,0.01,0.02,0.03,0.06, 0.01,0.01,1,0.5,0.03,0.02, 0.02,0.02,0.5,1,0.02,0.03, 0.03,0.03,0.03,0.02,1,0.03, 0.06,0.06,0.02,0.03,0.03,1)) Matrix <- matrix(data, ncol = 6,nrow=6, byrow = FALSE) row.names(Matrix) <- c("1A", "1B", "2A", "2B", "3A", "3B") colnames(Matrix) <- c("1A", "1B", "2A", "2B", "3A", "3B") # 1. 指定要复制的样本名称和新样本名称 target_sample <- "3B" new_sample <- "3C" # 2. 提取目标样本的行数据(新样本与原有样本的关联值) new_row <- Matrix[target_sample, ] # 3. 提取目标样本的列数据(原有样本与新样本的关联值,与行数据一致) new_col <- Matrix[, target_sample] # 4. 扩展原矩阵:先加新列,再加新行 Matrix_extended <- cbind(Matrix, new_col) Matrix_extended <- rbind(Matrix_extended, c(new_row, 1)) # 对角线值设为1(样本自身关联度) # 5. 更新行列名称 colnames(Matrix_extended)[ncol(Matrix_extended)] <- new_sample row.names(Matrix_extended)[nrow(Matrix_extended)] <- new_sample # 查看结果 Matrix_extended
代码说明
- 利用亲缘关系矩阵的对称性,直接复用目标样本的行/列数据作为新样本的关联值
- 扩展矩阵时,通过
cbind添加新列、rbind添加新行,新行末尾设为1(样本与自身的关联度为1) - 自动更新行列名称,无需手动修改
运行后得到的结果与期望的Matrix2完全一致。
内容的提问来源于Stack Exchange,提问作者JuanJMV
相关产品推荐
相关产品推荐

