R 查找矩阵之间的公共值,并返回具有行列位置的矩阵

R 查找矩阵之间的公共值,并返回具有行列位置的矩阵,r,matrix,R,Matrix,我希望在矩阵之间找到共享值,并返回矩阵中的位置(行col) set.seed(123) m <- matrix(sample(4), 2, 2, byrow = T) # m # [,1] [,2] # [1,] 2 3 # [2,] 1 4 m2 <- matrix(sample(4), 2, 2, byrow = F) # m2 # [,1] [,2] # [1,] 4 2 # [2,] 1 3 如果这可以推广

我希望在矩阵之间找到共享值,并返回
矩阵中的位置(行col)

set.seed(123)
m <- matrix(sample(4), 2, 2, byrow = T)
# m
#      [,1] [,2]
# [1,]    2    3
# [2,]    1    4
m2 <- matrix(sample(4), 2, 2, byrow = F)
# m2
#      [,1] [,2]
# [1,]    4    2
# [2,]    1    3

如果这可以推广到不相同的矩阵(不同的
dim
),则会有额外的好处。

此函数提供所需的输出,但在两个矩阵之间
dim()
相等的条件下工作

为了将其推广到不完全相同的矩阵,解决方案是首先将较大的矩阵子集

键是
,它(mat1==mat2,arr.ind=T)
用于获取行列索引:

 which(m==m2, arr.ind=T)
     row col
[1,]   2   1
函数内部:

find_in_matr <- function(mat1, mat2) {

  if (!all(dim(mat1) == dim(mat2))) {
    stop("mat1 and mat2 need to have the same dim()!")
  }

  m <- mat1 
  m[] <- NA # copy mat1 dim, and empty values

  loc <- which(mat1==mat2, arr.ind=T) # find positions (both indxs)

  m[loc] <- mapply(paste, sep="-", loc[, 1], loc[, 2]) # paste indxs
  return(m)
}
find_in_matr愚蠢的管道版本

library(magrittr)

(m == m2) %>% 
  `[<-`(!., NA) %>% 
  `[<-`((w <- which(., arr = T)), apply(w, 1, paste, collapse = '-'))

#      [,1]  [,2]
# [1,] NA    NA  
# [2,] "2-1" NA  
库(magrittr)
(m==m2)%>%
`[% 

`[大小相等

一个选择是

replace(m * NA, m == m2, paste(row(m), col(m), sep = "-")[m == m2])
#      [,1]  [,2]
# [1,] NA    NA  
# [2,] "2-1" NA  
不同的尺寸

我认为,在这种情况下,无论采用何种方法,首先需要将两个矩阵修剪为大小相等的矩阵

set.seed(12)
(m <- matrix(sample(6), 2, 3, byrow = TRUE))
#      [,1] [,2] [,3]
# [1,]    1    5    4
# [2,]    6    3    2
(m2 <- matrix(sample(6), 3, 2, byrow = FALSE))
#      [,1] [,2]
# [1,]    2    5
# [2,]    4    3
# [3,]    1    6

out <- matrix(NA, max(nrow(m), nrow(m2)), max(ncol(m), ncol(m2)))
mrow <- min(nrow(m), nrow(m2))
mcol <- min(ncol(m), ncol(m2))
mTrim <- m[1:mrow, 1:mcol]
m2Trim <- m2[1:mrow, 1:mcol]
out[1:mrow, 1:mcol][mTrim == m2Trim] <- paste(row(mTrim), col(mTrim), sep = "-")[mTrim == m2Trim]
out
#      [,1] [,2]  [,3]
# [1,] NA   "1-2" NA  
# [2,] NA   "2-2" NA  
# [3,] NA   NA    NA 
set.seed(12)

(m我尝试使用
ifelse()


x是的,我同意,应该在比较之前进行修剪。
replace(m * NA, m == m2, paste(row(m), col(m), sep = "-")[m == m2])
#      [,1]  [,2]
# [1,] NA    NA  
# [2,] "2-1" NA  
set.seed(12)
(m <- matrix(sample(6), 2, 3, byrow = TRUE))
#      [,1] [,2] [,3]
# [1,]    1    5    4
# [2,]    6    3    2
(m2 <- matrix(sample(6), 3, 2, byrow = FALSE))
#      [,1] [,2]
# [1,]    2    5
# [2,]    4    3
# [3,]    1    6

out <- matrix(NA, max(nrow(m), nrow(m2)), max(ncol(m), ncol(m2)))
mrow <- min(nrow(m), nrow(m2))
mcol <- min(ncol(m), ncol(m2))
mTrim <- m[1:mrow, 1:mcol]
m2Trim <- m2[1:mrow, 1:mcol]
out[1:mrow, 1:mcol][mTrim == m2Trim] <- paste(row(mTrim), col(mTrim), sep = "-")[mTrim == m2Trim]
out
#      [,1] [,2]  [,3]
# [1,] NA   "1-2" NA  
# [2,] NA   "2-2" NA  
# [3,] NA   NA    NA 
x <- apply(which(m == m2, arr.ind = T), 1, paste, collapse = "-")
ifelse(m != m2, NA, x)

#     [,1]  [,2]
# [1,] NA    NA  
# [2,] "2-1" NA 
set.seed(999)
m1 <- matrix(sample(1:3, 12, replace = T), 3, 4)
m2 <- matrix(sample(1:3, 12, replace = T), 3, 4)

x <- apply(which(m1 == m2, arr.ind = T), 1, paste, collapse = "-")
ifelse(m1 != m2, NA, x)

#      [,1]  [,2]  [,3]  [,4] 
# [1,] NA    "1-4" NA    "3-4"
# [2,] NA    NA    "2-3" NA   
# [3,] "2-3" NA    NA    "1-2"