How to filter a matrix by the value of another

I have 2 matrices: m1 and m2 .

m1 :

  1 2 3 4 5 1 v11 v12 v13 v14 v15 2 v21 v22 v23 v24 v25 3 v31 v32 v33 v34 v35 4 v41 v42 v43 v44 v45 5 v51 v52 v53 v54 v55 

m2 :

  x1, x2 1 1 1 2 1 4 2 2 2 3 2 5 

I would like to keep m1 if rowname and colname are found in m2 , otherwise I would like to write "NA" in the location

eg. the result should be:

m1:

  1 2 3 4 5 1 v11 v12 NA v14 NA 2 NA v22 v23 NA v25 3 NA NA NA NA NA 4 NA NA NA NA NA 5 NA NA NA NA NA 

So far I have been trying to use:

 m1[!(rownames(m1) %in% m2$x1 & colnames(m1) %in% m1$x2)]<-NA 

Is the result incorrect? Any suggestions?

+4
source share
2 answers

In my old answer, I thought the OP wants to select specific elements from m1 based on m2 . Hong Ooi's answer works very well if dimnames m1 match the row and column indices, and m2 contains integers, not character values. Here's an approximate solution if they don't necessarily line up.

 m1 <- matrix(c("V11","V21","V12","V22","V13","V23"),nrow=2,ncol=3) dimnames(m1) <- list(c("r2","r1"),c("c1","c2","c3")) m2 <- matrix(c("r1","r1","r2","c1","c3","c3"),nrow=3,ncol=2) > m1 c1 c2 c3 r2 "V11" "V12" "V13" r1 "V21" "V22" "V23" > m2 [,1] [,2] [1,] "r1" "c1" [2,] "r1" "c3" [3,] "r2" "c3" temp <- matrix(TRUE,nrow=nrow(m1),ncol=ncol(m1)) for(i in 1:nrow(m2)){ temp[which(rownames(m1)==m2[i,1]),which(colnames(m1)==m2[i,2])] <- FALSE } m1[temp] <- NA > m1 c1 c2 c3 r2 NA NA "V13" r1 "V21" NA "V23" 

Old answer:

 m1 <- matrix(c("V11","V21","V12","V22","V13","V23"),nrow=2,ncol=3) > m1 [,1] [,2] [,3] [1,] "V11" "V12" "V13" [2,] "V21" "V22" "V23" m2 <- matrix(c(1,1,2,1,3,3),nrow=3,ncol=2) > m2 [,1] [,2] [1,] 1 1 [2,] 1 3 [3,] 2 3 keep <- paste(paste0(m2[,1],m2[,2]),collapse="|") m1[!grepl(keep,m1)] <- NA > m1 [,1] [,2] [,3] [1,] "V11" NA "V13" [2,] NA NA "V23" 

Or as a single line:

 m1[!grepl(paste(paste0(m2[,1],m2[,2]),collapse="|"),m1)] <- NA 
+2
source

I can come up with a two-line:

 m <- m1[NA,] m[m2] <- m1[m2] 
+2
source

Source: https://habr.com/ru/post/1497267/


All Articles