比较矩阵行并替换匹配元素

时间:2020-05-05 20:34:53

标签: r if-statement matrix match

我想比较两个矩阵。如果第一个矩阵中的行元素与第二个矩阵中的行元素匹配,那么我希望保留第二个矩阵中的行。如果行不匹配,那么我希望这些行为空。抱歉,我最近有一个类似的问题,但仍然无法解决。

输入:

> mat1<-cbind(letters[3:8])
> mat1
     [,1]
[1,] "c" 
[2,] "d" 
[3,] "e" 
[4,] "f" 
[5,] "g" 
[6,] "h" 

> mat2<-cbind(letters[1:5],1:5)
> mat2
     [,1] [,2]
[1,] "a"  "1" 
[2,] "b"  "2" 
[3,] "c"  "3" 
[4,] "d"  "4" 
[5,] "e"  "5" 

预期输出:

> mat3
     [,1] [,2]
[1,] "NA" "NA" 
[2,] "NA" "NA" 
[3,] "c"  "3" 
[4,] "d"  "4" 
[5,] "e"  "5" 

我尝试失败了:

> mat3<-mat2[ifelse(mat2[,1] %in% mat1[,1],mat2,""),]

Error in mat2[ifelse(mat2[, 1] %in% mat1[, 1], mat2, ""), ] : 
  no 'dimnames' attribute for array

我已经奋斗了几个小时,因此欢迎提出任何建议。

1 个答案:

答案 0 :(得分:1)

您步入正轨,但是答案比您尝试的要简单一些。 mat2[, 1] %in% mat1[, 1]将匹配项作为逻辑向量返回,我们可以使用该向量作为索引,将不匹配项设置为NA

mat1<-cbind(letters[3:8])
mat2<-cbind(letters[1:5],1:5)

match <- mat2[,1] %in% mat1 # gives a T/F vector of matches


mat3 <- mat2
mat3[!match,] <- NA