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

标签 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

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

最佳答案

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

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/

相关文章:

matlab - 如何生成具有均匀分布条目的随机实对称方阵

c++ - OpenCV:如何将图像保存在一个大矩阵中然后分别调用它们?

r - 为什么这给我一个 NaN

algorithm - 给定矩阵 [i, j] 中的一个位置,找到它所属的 block

javascript - 是否有js插件将矩阵参数转换为css3转换属性?

评估两个(纬度、经度)点之间的视线 (LOS) 的 R 代码

matlab - MATLAB 中的图像卷积 - conv 为什么比我的手写版本快 360 倍?

r - ggplot2 geom_bar 在某些情况下在位置 ="fill"时给出错误

r - 将 .rmd 文件编织为 .md 并使用不同的名称将 .md 文件上一级保存

r - 在R中创建报告