如果行/列名称出现在列表中,请用NA替换矩阵中的值

时间:2019-05-04 14:23:20

标签: r matrix

我有一个矩阵,具有匹配的行名和列名。我也有一些行/列名的列表。在矩阵中,我想用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

...及其某些版本,但是我显然做错了... 感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

我们可以使用rownamescolnames生成矩阵的rowcol并将其更改为NA,它们与{{ 1}}。

B

或者因为您的矩阵具有匹配的行名和列名,所以一种更容易理解的方法是先找出我们要更改为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 的行/列名,然后将其更改为{{ 1}}。

NA

答案 1 :(得分:1)

这里是使用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

答案 2 :(得分:1)

将行设置为NA,然后将列设置为NA。不使用任何软件包。

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