比较2个矩阵的列,以确定一个矩阵中应与另一矩阵配对的列值

时间:2018-11-19 15:05:04

标签: r

我有矩阵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 :(得分:0)

这是您重写的循环

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的行。

答案 1 :(得分:0)

这是使用多次调用apply的方法。我们在MN的列上进行迭代,以找出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))