【问题标题】:Add zeros to data matrix based on length of other matrix keeping colname order根据保持 colname 顺序的其他矩阵的长度向数据矩阵添加零
【发布时间】:2017-01-10 15:18:06
【问题描述】:

我有下面的矩阵mat1:

mat1 <- matrix (1:16, 4)
colnames(mat1) <- c("A1","B2","C3","D4"); row.names(mat1) <- c("A1","B2","C3","D4")

 mat1
   A1 B2 C3 D4
A1  1  5  9 13
B2  2  6 10 14
C3  3  7 11 15
D4  4  8 12 16

我还有一个更小的矩阵small_mat

small_mat <- matrix (1:4, 2)
colnames(small_mat) <- c("A1","C3"); row.names(small_mat) <- c("A1","C3")

  A1 C3
A1  1  3
C3  2  4

我想让small_mat 的大小与mat1 相同,在需要的地方添加零并保持colnamesrow.names 的顺序与mat1 相同。

期望的结果:

       A1 B2 C3 D4
    A1  1  0  3  0
    B2  0  0  0  0
    C3  2  0  4  0
    D4  0  0  0  0

我尝试从缺少 small_mat colnames 和随后使用 rbind.fill.matrix 中创建一个零矩阵,但没有达到目标:

not_in_small_mat <- colnames(mat1)[!(colnames(mat1) %in% colnames(small_mat))] # see what colnames are missing from small_mat 
zeros <- matrix(data=0,nrow=length(not_in_small_mat),ncol=length(colnames(mat1))) # create matrix of those needing adding 
colnames(zeros) <- colnames(mat1)

result <- rbind.fill.matrix(small_mat,zeros)

    A1 C3 B2 D4
[1,]  1  3 NA NA
[2,]  2  4 NA NA
[3,]  0  0  0  0
[4,]  0  0  0  0

【问题讨论】:

    标签: r matrix rbind


    【解决方案1】:

    这会将small_mat 插入到零矩阵中

    mat1 <- matrix(rep(0, 16), 4)
    colnames(mat1) <- c("A1", "B2", "C3", "D4")
    row.names(mat1) <- c("A1", "B2", "C3", "D4")
    
    small_mat <- matrix(1:4, 2)
    colnames(small_mat) <- c("A1", "C3")
    row.names(small_mat) <- c("A1", "C3")
    
    mat1[rownames(small_mat), colnames(small_mat)] <- small_mat
    
    mat1
       A1 B2 C3 D4
    A1  1  0  3  0
    B2  0  0  0  0
    C3  2  0  4  0
    D4  0  0  0  0
    

    【讨论】:

    • 谢谢,谢谢!值得一提的是mat1dimnames 需要在那里——我在我的真实数据中忽略了这一点,浪费了半个小时!
    猜你喜欢
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 2018-03-01
    • 2016-07-04
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多