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

对于行名和列名未存储在数据帧中的元素,将矩阵中的元素替换为NA

  •  0
  • bluepole  · 技术社区  · 8 年前

    假设我有一个矩阵 rmatrix 定义如下:

    set.seed(10)
    rmatrix  <-  matrix(sample(0:100, 16), ncol=4)
    dimnames(rmatrix) <- list(rownames(rmatrix, do.NULL = FALSE, 
       prefix = "row"), colnames(rmatrix, do.NULL = FALSE, prefix = "col"))
    rmatrix
    
         col1 col2 col3 col4
    row1   51    8   57   10
    row2   30   21   39   52
    row3   42   26   59   31
    row4   67   25  100   36
    

    df 存储的行和列名的某些组合 :

    df <- data.frame(r = c('row1', 'row1', 'row3', 'row4', 'row4', 'row4'), 
       c = c('col2', 'col4', 'col3', 'col3', 'col1', 'col2'))
    df
         r    c
    1 row1 col2
    2 row1 col4
    3 row3 col3
    4 row4 col3
    5 row4 col1
    6 row4 col2
    

    如何更改中的任何元素 NA 如果其名称不在 ? 谢谢

    2 回复  |  直到 8 年前
        1
  •  3
  •   d.b    8 年前
    out = replace(rmatrix*NA, as.matrix(df), rmatrix[as.matrix(df)])
    out
    #     col1 col2 col3 col4
    #row1   NA    8   NA   10
    #row2   NA   NA   NA   NA
    #row3   NA   NA   59   NA
    #row4   67   25  100   NA
    

    rmatrix 由字符组成

    replace(replace(rmatrix, TRUE, NA), as.matrix(df), rmatrix[as.matrix(df)])
    
        2
  •  2
  •   akrun    8 年前

    我们可以直接根据 setdiff

    library(dplyr)
    rmatrix[as.matrix(setdiff(data.frame(r = rownames(rmatrix)[row(rmatrix)],
         c= colnames(rmatrix)[col(rmatrix)]), df))] <- NA
    rmatrix
    #     col1 col2 col3 col4
    #row1   NA    8   NA   10
    #row2   NA   NA   NA   NA
    #row3   NA   NA   59   NA
    #row4   67   25  100   NA
    

    或者另一种选择是创建一个新的NAs矩阵,然后根据“df”中的索引用值填充它

    m1 <- sapply(df, function(x) as.numeric(gsub("\\D+", "", x)))
    rmatrix2 <- matrix(NA, nrow = nrow(rmatrix), ncol = ncol(rmatrix), 
                         dimnames = dimnames(rmatrix))
    rmatrix2[m1] <- rmatrix[m1]
    rmatrix2
    #     [,1] [,2] [,3] [,4]
    #[1,]   NA    8   NA   10
    #[2,]   NA   NA   NA   NA
    #[3,]   NA   NA   59   NA
    #[4,]   67   25  100   NA
    

    或者我们可以创建一个 sparseMatrix

    library(Matrix)
    r1 <- sparseMatrix(i = match(df[[1]], row.names(rmatrix)), 
       j = match(df[[2]], colnames(rmatrix)), x = rmatrix[as.matrix(df)])
    r1
    #  4 x 4 sparse Matrix of class "dgCMatrix"
    
    #[1,]  .  8   . 10
    #[2,]  .  .   .  .
    #[3,]  .  .  59  .
    #[4,] 67 25 100  .
    

    如果我们需要得到NA值

    (NA^!r1)*r1
    #4 x 4 Matrix of class "dgeMatrix"
    #     [,1] [,2] [,3] [,4]
    #[1,]   NA    8   NA   10
    #[2,]   NA   NA   NA   NA
    #[3,]   NA   NA   59   NA
    #[4,]   67   25  100   NA
    

    as.matrix