代码之家  ›  专栏  ›  技术社区  ›  IMJ

如何用其他矩阵匹配行和列的值填充矩阵?

  •  2
  • IMJ  · 技术社区  · 8 年前

    我试图使用其他矩阵中的值和R生成一个新矩阵。我试图在导入值时匹配行和列的名称。这就是我们要做的:

    我有两个矩阵;

         X1  X2  X3  X4
     X1   0   9   8   0
     X2   1   2   3   5
     X4   6   1   2   4
    
         X1  X2  X3  X4
     X1  NA  NA  NA  NA   
     X2  NA  NA  NA  NA   
     X3  NA  NA  NA  NA   
     X4  NA  NA  NA  NA   
    

    我想做

         X1  X2  X3  X4
     X1   0   9   8   0   
     X2   1   2   3   5
     X3  NA  NA  NA  NA   
     X4   6   1   2   4
    

    这些矩阵只是我的数据集的简单示例,我的实际数据更复杂。

    非常感谢,

    2 回复  |  直到 8 年前
        1
  •  3
  •   Sathish    8 年前

    检查两个矩阵中的行名和列名匹配将阻止 subscript out of bounds 错误见下文。

    mat2[rownames(mat2) %in% rownames(mat1), 
         colnames(mat2) %in% colnames(mat1)] <- mat1[rownames(mat1) %in% rownames(mat2), 
                                                     colnames(mat1) %in% colnames(mat2)] 
    mat2
    #    X1 X2 X3 X4
    # X1  0  9  8  0
    # X2  1  2  3  5
    # X3 NA NA NA NA
    # X4  6  1  2  4
    

    数据:

    mat1 <- read.table(text = '    X1  X2  X3  X4
     X1   0   9   8   0
                       X2   1   2   3   5
                       X4   6   1   2   4', header = TRUE)
    
    mat1 <- as.matrix(mat1)
    mat2 <- matrix(NA, nrow = 4, ncol = 4, dimnames = list(paste0("X", 1:4),
                                                           paste0("X", 1:4)))
    
        2
  •  1
  •   Bruno Vilela    8 年前

    如果我理解你的问题,你可以这样做:

    # Building your matrices
    mat1 <- matrix(runif(12), nrow = 3, ncol = 4)
    mat2 <- matrix(NA, nrow = 4, ncol = 4)
    labs <- paste0("x", 1:4)
    colnames(mat1) <- colnames(mat2) <- labs
    rownames(mat2) <- labs
    rownames(mat1) <- labs[c(1:2, 4)]
    
    # 
    rows <- sort(unique(c(rownames(mat1), rownames(mat2))))
    result <- matrix(NA, nrow = length(rows), ncol = ncol(mat1))
    result[match(rownames(mat1), rows), ] <- mat1