合并一个矩阵及其转置得到一个方对称矩阵

Combine a matrix and its transpose to get a square symmetric matrix

矩阵形式如

structure(c("W1", NA, NA, NA, NA, "W1", NA, NA, NA, NA, NA, "W2", 
NA, NA, "W2", NA, "W2", NA, NA, "W2", NA, NA, "W3", "W3", NA, 
NA, "W2", NA, NA, "W2", NA, NA, "W3", "W3", NA, NA, NA, "W3", 
"W3", NA, NA, NA, NA, NA, NA, "W1", NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, "W2", NA, NA, "W2", "W1", NA, 
NA, NA, NA, "W1", NA, NA, NA, NA), .Dim = c(5L, 15L))

genmat



    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15]
[1,] "W1" "W1" NA   NA   NA   NA   NA   NA   NA   "W1"  NA    NA    NA    "W1"  "W1" 
[2,] NA   NA   "W2" "W2" NA   "W2" NA   NA   NA   NA    NA    NA    "W2"  NA    NA   
[3,] NA   NA   NA   NA   "W3" NA   "W3" "W3" NA   NA    NA    NA    NA    NA    NA   
[4,] NA   NA   NA   NA   "W3" NA   "W3" "W3" NA   NA    NA    NA    NA    NA    NA   
[5,] NA   NA   "W2" "W2" NA   "W2" NA   NA   NA   NA    NA    NA    "W2"  NA    NA   

我想把这个矩阵和它的转置结合起来得到一个形式的方阵,

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15]
 [1,] "W1" "W1" NA   NA   NA   NA   NA   NA   NA   "W1"  NA    NA    NA    "W1"  "W1" 
 [2,] "W1" "W1" NA   NA   NA   NA   NA   NA   NA   "W1"  NA    NA    NA    "W1"  "W1" 
 [3,] NA   NA   "W2" "W2" NA   "W2" NA   NA   NA   NA    NA    NA    "W2"  NA    NA   
 [4,] NA   NA   "W2" "W2" NA   "W2" NA   NA   NA   NA    NA    NA    "W2"  NA    NA   
 [5,] NA   NA   NA   NA   "W3" NA   "W3" "W3" NA   NA    NA    NA    NA    NA    NA   
 [6,] NA   NA   "W2" "W2" NA   "W2" NA   NA   NA   NA    NA    NA    "W2"  NA    NA   
 [7,] NA   NA   NA   NA   "W3" NA   "W3" "W3" NA   NA    NA    NA    NA    NA    NA   
 [8,] NA   NA   NA   NA   "W3" NA   "W3" "W3" NA   NA    NA    NA    NA    NA    NA   
 [9,] NA   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA   
[10,] "W1" "W1" NA   NA   NA   NA   NA   NA   NA   "W1"  NA    NA    NA    "W1"  "W1" 
[11,] NA   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA   
[12,] NA   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA   
[13,] NA   NA   "W2" "W2" NA   "W2" NA   NA   NA   NA    NA    NA    "W2"  NA    NA   
[14,] "W1" "W1" NA   NA   NA   NA   NA   NA   NA   "W1"  NA    NA    NA    "W1"  "W1" 
[15,] "W1" "W1" NA   NA   NA   NA   NA   NA   NA   "W1"  NA    NA    NA    "W1"  "W1" 

这个矩阵的元素来自 genmat 的迭代及其转置。即输出矩阵第1、2、10、14、15列的元素与genmat对应列和genmat.

转置对应行相同

我真的不确定我是否理解了这个问题,但这似乎给出了预期的输出:

genmat[apply(genmat, 2, function(col) match(TRUE, !is.na(col))), ]

它的作用:对于结果的第 i 行,使用 genmat 的第 k 行,其中 k 是结果的索引genmat 的第 i 列的第一个非 NA 值。

在非常明确的普通 for 循环中,它看起来像:

res <- matrix(NA_character_, nrow = NCOL(genmat), ncol = NCOL(genmat))

for (i in seq_len(NROW(res))) {
  first_non_NA <- which(!is.na(genmat[, i]))[1]
  res[i, ] <- genmat[first_non_NA, ]
}

注意:这并不能保证 res 的对称性。对称性来自示例数据的一些非显式特征。