【问题标题】:Replace values in a matrix with NAs if the row/column names appear in a list如果行/列名称出现在列表中,则用 NA 替换矩阵中的值
【发布时间】:2019-05-04 14:23:19
【问题描述】:

我有一个匹配行名和列名的矩阵。我还有一个包含一些行/列名称的列表。在矩阵中,我想用 NA 替换列表中未包含的名称的行和列的所有单元格。

这是矩阵:

> A <- matrix(c(2,0,3,0,5,NA,1,0,NA,6,11,9,0,1,NA,2,0,1,NA,3,6,1,NA,0,0), nrow=5, ncol=5) 
> dimnames(A) = list(c("ID1", "ID2", "ID3", "ID4", "ID5"),  c("ID1", "ID2", "ID3", "ID4", "ID5"))
> A
    ID1 ID2 ID3 ID4 ID5
ID1   2  NA  11   2   6
ID2   0   1   9   0   1
ID3   3   0   0   1  NA
ID4   0  NA   1  NA   0
ID5   5   6  NA   3   0

列表可能如下所示:

  B<-list("ID1","ID2","ID5")
[[1]]
[1] "ID1"

[[2]]
[1] "ID2"

[[3]]
[1] "ID5"

结果应该是这样的:

    ID1 ID2 ID3 ID4 ID5
ID1   2  NA  NA  NA  6
ID2   0   1  NA  NA   1
ID3  NA  NA  NA  NA  NA
ID4  NA  NA  NA  NA  NA
ID5   5   6  NA  NA   0

我尝试了以下方法:

C <- A[A != B,A != B]<- NA
C <- A[(!(A[B,B]))]<- NA

...以及它的某些版本,但我显然做错了什么... 感谢您的帮助。

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    我们可以使用rowcol生成矩阵的rownamescolnames,并将它们更改为与B中的名称不匹配的NA

    A[!(rownames(A)[row(A)] %in% unlist(B) & colnames(A)[col(A)] %in% unlist(B))] <- NA
    
    A
    #    ID1 ID2 ID3 ID4 ID5
    #ID1   2  NA  NA  NA   6
    #ID2   0   1  NA  NA   1
    #ID3  NA  NA  NA  NA  NA
    #ID4  NA  NA  NA  NA  NA
    #ID5   5   6  NA  NA   0
    

    或者,由于您有一个具有匹配行和列名称的矩阵,因此更容易理解的方法是首先找出我们想要更改为 NA 的行/列名称,然后将它们依次更改为 NA .

    vals <- setdiff(rownames(A), unlist(B)) 
    A[vals, ] <- NA     #Turn rows to NA
    A[, vals] <- NA     #Turn columns to NA
    

    【讨论】:

      【解决方案2】:

      这是一个使用tidyverse的选项

      library(tidyverse)
      library(reshape2)
      v1 <- unlist(B)
      melt(A) %>%
         mutate(value = replace(value, !((Var1  %in% v1) & 
                                         (Var2 %in% v1)), NA)) %>% 
         spread(Var2, value) %>%
         column_to_rownames('Var1')
      #     ID1 ID2 ID3 ID4 ID5
      #ID1   2  NA  NA  NA   6
      #ID2   0   1  NA  NA   1
      #ID3  NA  NA  NA  NA  NA
      #ID4  NA  NA  NA  NA  NA
      #ID5   5   6  NA  NA   0
      

      【讨论】:

        【解决方案3】:

        将行设置为 NA,然后将列设置为 NA。没有使用任何包。

        A[!rownames(A) %in% unlist(B), ] <- NA
        A[, !colnames(A) %in% unlist(B)] <- NA
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-01-25
          • 1970-01-01
          • 2016-04-24
          • 2019-07-22
          • 2012-06-03
          • 2020-01-07
          • 1970-01-01
          相关资源
          最近更新 更多