将一个矩阵的行名和列名匹配到另一个矩阵,以逐元素进行计算

时间:2020-07-19 04:39:57

标签: r matrix match

我有两个矩阵,我需要对行名和列名进行匹配才能进行逐个元素的计算。第一个计算是phij / pij,第二个计算是((phij-pij)^ 2)/ pij 长矩阵phij的行名用短划线隔开,例如Aaa- Baa 。列名没有破折号。我需要将破折号后的行名部分(即 Baa )和phij矩阵中的列名与较小的矩阵pij的行名和列名进行匹配。

我尝试使用for循环,但它与实际的行名和列名不匹配,而是在序列中查找位置。

.svgfilter {
    width: 1em;
    height: 1em;
    margin-bottom: -2px;
    filter: invert(100%);
}

数据:

phij:

LR<-phij
ChiSq<-phij

ROWS <- data.frame(ROW0=rownames(phij),
                     ROW1=substr(rownames(phij),regexpr("-", rownames(phij))+1,nchar(rownames(phij))))
  
  COLNAMES  <- c(colnames(phij))
  for(rowN in 1:length(ROWS$ROW0)){
    for(colN in COLNAMES){
      LR[ROWS$ROW0[rowN],colN]<-LR[ROWS$ROW0[rowN],colN]/pij[ROWS$ROW1[rowN],colN]
      ChiSq[ROWS$ROW0[rowN],colN]<-((ChiSq[ROWS$ROW0[rowN],colN]-pij[ROWS$ROW1[rowN],colN])^2)/pij[ROWS$ROW1[rowN],colN]
    }
  }

pij:

structure(c(0.111111111111111, 0.2, 0, 0, 0, 0.25, 0, 0.666666666666667, 
0.166666666666667, 0, 0, 0.666666666666667, 0.5, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.4, 0.333333333333333, 0, 1, 
0, 0.166666666666667, 0, 0.571428571428571, 0, 0, 0, 0.4, 0.272727272727273, 
0, 0, 0, 0, 0, 0, 0, 0, 0.222222222222222, 0.6, 0, 0, 0.25, 0, 
0, 0.333333333333333, 0.333333333333333, 0, 0, 0.333333333333333, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5, 1, 0, 0, 0, 0, 0, 0.2, 0.666666666666667, 
0, 0, 0, 0.166666666666667, 0, 0.142857142857143, 1, 0, 0, 0.2, 
0.272727272727273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0.25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0.222222222222222, 0.2, 0, 0, 0, 0, 
0, 0, 0.166666666666667, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0.2, 0, 0, 0, 0, 0.333333333333333, 0, 0.142857142857143, 
0, 0, 0, 0.2, 0.181818181818182, 0, 0, 0, 0, 0, 0, 0, 0, 0.444444444444444, 
0, 0, 0, 0.75, 0.5, 0, 0, 0.333333333333333, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0.5, 0, 0, 0, 1, 1, 0, 0.2, 0, 0, 0, 1, 0.333333333333333, 
0, 0.142857142857143, 0, 0, 1, 0, 0.272727272727273, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), class = "table", .Dim = c(49L, 
7L), .Dimnames = list(i = c("A-A", "A-Aa", "A-Aaa", "A-B", "A-Ba", 
"A-Baa", "A-Caa", "Aa-A", "Aa-Aa", "Aa-Aaa", "Aa-B", "Aa-Ba", 
"Aa-Baa", "Aa-Caa", "Aaa-A", "Aaa-Aa", "Aaa-Aaa", "Aaa-B", "Aaa-Ba", 
"Aaa-Baa", "Aaa-Caa", "B-A", "B-Aa", "B-Aaa", "B-B", "B-Ba", 
"B-Baa", "B-Caa", "Ba-A", "Ba-Aa", "Ba-Aaa", "Ba-B", "Ba-Ba", 
"Ba-Baa", "Ba-Caa", "Baa-A", "Baa-Aa", "Baa-Aaa", "Baa-B", "Baa-Ba", 
"Baa-Baa", "Baa-Caa", "Caa-A", "Caa-Aa", "Caa-Aaa", "Caa-B", 
"Caa-Ba", "Caa-Baa", "Caa-Caa"), j = c("A", "Aa", "Aaa", "B", 
"Ba", "Baa", "Caa")))

1 个答案:

答案 0 :(得分:1)

您可以创建一个新的pij矩阵,该矩阵的尺寸与phij相同,然后执行所需的计算。

new_pij <- pij[sub('-.*', '', rownames(phij)), colnames(phij)]

然后您可以执行以下操作:

phij/new_pij

((phij-new_pij)^2)/new_pij