我有一个矩阵,具有匹配的行名和列名。我也有一些行/列名的列表。在矩阵中,我想用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
...及其某些版本,但是我显然做错了... 感谢您的帮助。
答案 0 :(得分:1)
我们可以使用rownames
和colnames
生成矩阵的row
和col
并将其更改为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