Сравните столбцы из 2 матриц, чтобы определить значения столбцов в одной матрице, которые должны быть связаны с другой матрицей - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть матрица M и N, заданная

> M
     [,1] [,2] [,3] [,4] [,5]
[1,]    5    1    1    7    7
[2,]    4    7    4    2    7
[3,]   11   19   20   50   30

> N
      [,1] [,2]
[1,]    7    1
[2,]    7    7

Я хочу найти значения столбца в M, которые должны быть в паре с N, чтобы получить

  [,1] [,2]
    7    1
    7    7
    30   19

Я попробовал код ниже. Могу ли я получить эффективный способ сделать это или особенно делать это без использования команд for?

E=numeric()
for (i in 1:2){
    for (j in 1:5) {
        if (N[1,i]==M[1,j] & N[2,i]==M[2,j]){
           E[i]= M[3,j]
        }
    }  
}
E
rbind(N,E)

Ответы [ 2 ]

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

Вот способ использования нескольких вызовов на apply. Мы перебираем столбцы M и N, чтобы найти, какой столбец в M соответствует первому столбцу в N, а затем какой второй столбец в N.

logicals <- apply(M[-3,], # exclude third row
                  2, # iterate over columns
                  FUN = function(x) 
                    apply(N, 2, #then iterate over columns of N
                          FUN = function(y) all(x == y)))

#       [,1]  [,2]  [,3]  [,4]  [,5]
# [1,] FALSE FALSE FALSE FALSE  TRUE
# [2,] FALSE  TRUE FALSE FALSE FALSE  

M[,apply(logicals, 1, which)]

     [,1] [,2]
[1,]    7    1
[2,]    7    7
[3,]   30   19

Данные

M <- structure(c(5, 4, 11, 1, 7, 19, 
        1, 4, 20, 7, 2, 50, 
        7, 7, 30), 
      .Dim = c(3L, 5L))

N <- structure(c(7, 7, 1, 7), .Dim = c(2L, 2L))
0 голосов
/ 19 ноября 2018

Ну вот, ваш цикл переписан

E <- vapply(seq(nrow(N)), function(i) M[3,M[1,] == N[1,i] & M[2,] == N[2,i]], numeric(1))
# with
> rbind(N,E)
  [,1] [,2]
     7    1
     7    7
E   30   19 

есть только один цикл (vapply - оболочка для цикла), который проходит по строкам N.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...