Найти общие значения между матрицами и возвращаемой матрицей в строке - PullRequest
0 голосов
/ 29 ноября 2018

Я бы хотел найти между матрицами общие значения и вернуть местоположения (строки-строки) в matrix.

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

Ожидаемый результат:

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

Бонус, если это можно обобщить на неидентичные матрицы (разные dim).

Ответы [ 4 ]

0 голосов
/ 29 ноября 2018

Я пытаюсь сделать это с ifelse():

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"
0 голосов
/ 29 ноября 2018

Глупая версия

library(magrittr)

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

#      [,1]  [,2]
# [1,] NA    NA  
# [2,] "2-1" NA  
0 голосов
/ 29 ноября 2018

Равные размеры

Один вариант будет

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 
0 голосов
/ 29 ноября 2018

Эта функция дает желаемый результат, но работает при условии, что dim() равно между двумя матрицами.

Чтобы обобщить это для неидентичных матриц, решением было бы вначале поднастроить большую матрицу.

Ключ - which(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)
}

Пример:

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

find_in_matr(m, m2)
#    [,1]  [,2]
# [1,] NA    NA  
# [2,] "2-1" NA 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...