我有一个具有匹配行名称和列名称的矩阵。我还有一个包含一些行/列名称的列表。在矩阵中,我想用 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
...以及它的某些版本,但我显然做错了什么... 感谢您的帮助。
最佳答案
我们可以使用 row
和 col
生成矩阵的 rownames
和 colnames
并将它们更改为 NA
与 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
或者,由于您有一个具有匹配行和列名称的矩阵,更容易理解的方法是首先找出我们想要更改为 NA 的行/列名称,然后更改它们依次到NA
。
vals <- setdiff(rownames(A), unlist(B))
A[vals, ] <- NA #Turn rows to NA
A[, vals] <- NA #Turn columns to NA
关于如果行/列名称出现在列表中,则用 NA 替换矩阵中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55983479/