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