首页 > 解决方案 > 展开矩阵并在R中按键替换行名和列名

问题描述

我正在运行一个线性混合模型,其中包含来自相关个人的数据和来自同一个人的多个样本。我有一个亲属关系矩阵,每个人都有一个亲属关系 ID。亲属关系 ID 与模型正在分析的化验 ID 不同。我需要创建一个亲属关系矩阵,每个检测 ID 有一行/列,而不是每个亲属关系 ID 有一行/列。

key = data.frame(assay_id = c("aid_1","aid_2","aid_3","aid_4","aid_5","aid_6"), kinship_id = c("kid_1","kid_2","kid_2","kid_3","kid_3","kid_4"))
key
start_kin = data.frame(kid_1 = c(1,0.25,0,0.5), kid_2= c(0.25,1,0,0.5), kid_3 = c(0,0,1,0.25), kid_4= c(0.5,0.5,0.25,1) )
rownames(start_kin) =c("kid_1","kid_2","kid_3","kid_4")
start_kin
intermediate_kin = start_kin
intermediate_kin$kid_2a = intermediate_kin$kid_2
intermediate_kin$kid_3a = intermediate_kin$kid_3
intermediate_kin["kid_2a",] = intermediate_kin["kid_2",]
intermediate_kin["kid_3a",] = intermediate_kin["kid_3",]
intermediate_kin
final_kin = intermediate_kin
rownames(final_kin) = c("aid_1","aid_2","aid_4","aid_6","aid_3","aid_5")
names(final_kin) = c("aid_1","aid_2","aid_4","aid_6","aid_3","aid_5")
final_kin

标签: rmatrixcorrelation

解决方案


根据您的描述,我不确定您到底想做什么。这是基于我的猜测的代码示例。在这里,每个亲属都有 3 次检测。

kin <- letters[1:4]
assay <- 1:3
dat <- expand.grid(kin = kin, assay = assay)
dat <- apply(dat, 1, paste0, collapse = "-")
n <- length(dat)
m <- matrix(rep(0, n * n), nrow = n)
rownames(m) <- dat
colnames(m) <- dat
m

#     a-1 b-1 c-1 d-1 a-2 b-2 c-2 d-2 a-3 b-3 c-3 d-3
# a-1   0   0   0   0   0   0   0   0   0   0   0   0
# b-1   0   0   0   0   0   0   0   0   0   0   0   0
# c-1   0   0   0   0   0   0   0   0   0   0   0   0
# d-1   0   0   0   0   0   0   0   0   0   0   0   0
# a-2   0   0   0   0   0   0   0   0   0   0   0   0
# b-2   0   0   0   0   0   0   0   0   0   0   0   0
# c-2   0   0   0   0   0   0   0   0   0   0   0   0
# d-2   0   0   0   0   0   0   0   0   0   0   0   0
# a-3   0   0   0   0   0   0   0   0   0   0   0   0
# b-3   0   0   0   0   0   0   0   0   0   0   0   0
# c-3   0   0   0   0   0   0   0   0   0   0   0   0
# d-3   0   0   0   0   0   0   0   0   0   0   0   0

推荐阅读