R: How to match/join 2 matrices of different dimensions (nrow/ncol)?

前端 未结 2 1793
说谎
说谎 2020-12-11 07:22

I want to match/join two matrices, a small one with values should match in a bigger one by rownames/colnames. I only find this answer. However, I cannot match the locations

相关标签:
2条回答
  • 2020-12-11 07:43

    1) as.data.frame.table Convert the small matrix to the following long form data frame L having columns Var1, Var2 and Freq and then use matrix subscripting to assign the components:

    L <- as.data.frame.table(matrix)
    full_matrix[as.matrix(L[1:2])] <- L$Freq
    

    giving:

    > full_matrix
       A  B  C  D  E  F
    A NA NA NA NA NA NA
    B  2  1 NA NA NA  3
    C  4  5 NA NA NA  1
    D NA NA NA NA NA NA
    E  3  7 NA NA NA  6
    F NA NA NA NA NA NA
    

    2) direct subscripting

    full_matrix[rownames(matrix), colnames(matrix)] <- matrix
    

    Note: The two solutions give identical results:

    a = c("A", "B", "C", "D", "E", "F")
    full_matrix = matrix(nrow = length(a), ncol=length(a))
    dimnames(full_matrix) <- list(levels(as.factor(a)), levels(as.factor(a)))
    matrix = matrix(c(2, 4, 3, 1, 5, 7, 3, 1, 6), nrow=3, ncol=3)
    dimnames(matrix) <- list(c("B","C","E"), c("A","B","F"))
    
    fm1 <- full_matrix
    L <- as.data.frame.table(matrix)
    fm1[as.matrix(L[1:2])] <- L$Freq
    
    fm2 <- full_matrix
    fm2[rownames(matrix), colnames(matrix)] <- matrix
    
    identical(fm1, fm2)
    ## [1] TRUE
    
    0 讨论(0)
  • 2020-12-11 07:48

    See below using R's match function (I renamed your small matrix):

    a = c("A", "B", "C", "D", "E", "F")
    full_matrix = matrix(nrow = length(a), ncol=length(a))
    dimnames(full_matrix) <- list(levels(as.factor(a)), levels(as.factor(a)))
    
    small_matrix = matrix(c(2, 4, 3, 1, 5, 7, 3, 1, 6), nrow=3, ncol=3)
    dimnames(small_matrix) <- list(as.factor(c("B","C","E")), as.factor(c("A","B","F")))
    

    You can then use:

    rowmatch <- match(rownames(small_matrix), rownames(full_matrix))
    colmatch <- match(colnames(small_matrix), colnames(full_matrix))
    full_matrix[rowmatch, colmatch] <- small_matrix
    

    Which gives you the desired output:

       A  B  C  D  E  F
    A NA NA NA NA NA NA
    B  2  1 NA NA NA  3
    C  4  5 NA NA NA  1
    D NA NA NA NA NA NA
    E  3  7 NA NA NA  6
    F NA NA NA NA NA NA
    

    Or alternatively, you can use %in% with slighly different syntax:

    full_matrix[rownames(full_matrix) %in% rownames(small_matrix), 
                colnames(full_matrix) %in% colnames(small_matrix)] <- small_matrix
    
    0 讨论(0)
提交回复
热议问题