R 高效优雅地检查矩阵的哪些行存在于另一个矩阵中

R 高效优雅地检查矩阵的哪些行存在于另一个矩阵中,r,R,假设我们要检查矩阵(或数据帧)中的哪些行存在于另一个矩阵中。我找到的所有基本操作的解决方案似乎要么需要一个库(this),要么冗长而晦涩,例如: (m1 = matrix(1:10, ncol=2)) [,1] [,2] [1,] 1 6 [2,] 2 7 [3,] 3 8 [4,] 4 9 [5,] 5 10 (m2 = matrix(c(1,3,4,-1,6,7,9,8), ncol=2)) [,1] [,2] [

假设我们要检查矩阵(或数据帧)中的哪些行存在于另一个矩阵中。我找到的所有基本操作的解决方案似乎要么需要一个库(this),要么冗长而晦涩,例如:

(m1 = matrix(1:10, ncol=2))
     [,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8
[4,]    4    9
[5,]    5   10
(m2 = matrix(c(1,3,4,-1,6,7,9,8), ncol=2))
     [,1] [,2]
[1,]    1    6
[2,]    3    7
[3,]    4    9
[4,]   -1    8

# ugh!
rowSums(outer(m2[,1], m1[,1], "==") & outer(m2[,2], m1[,2], "==")) != 0
[1]  TRUE FALSE  TRUE FALSE
有人知道一种使用基函数的更优雅的方法,其效率与本例相当吗?(注意。
apply()
效率不高。

您可以使用match:

> m1 = matrix(1:10, ncol=2)
> m2 = matrix(c(1,3,4,-1,6,7,9,8), ncol=2)
> m<-match(data.frame(t(m1)), data.frame(t(m2)))
> m
[1]  1 NA NA  3 NA
您可以使用以下任一变体检索行:

> m1[!is.na(m),]
     [,1] [,2]
[1,]    1    6
[2,]    4    9
但是,如果您确实需要它而不是索引,只需使用
merge
(返回
data.frame
):


优雅显然在旁观者的眼中,因为那句话对我来说可能相当优雅,但要想冲出去并不容易——像我这样的人将不得不参考笔记。IMO的优势在于更接近自然语言。如果你还想考虑一个包解决方案,尝试<代码> dPLYR::交叉(M1,M2)< /C>(如果它们是数据。帧)可能是代码>重复的(RBIN(M2,M1),FROWSTON= TRUE)[1:NRO(M2)] < @ DCONDOD-DILIMUS <代码> DPLYR::交叉(数据帧(M1),数据帧(M2))< /代码>“错误:不兼容”
> m1[!is.na(m),]
     [,1] [,2]
[1,]    1    6
[2,]    4    9
> merge(m1, m2)
  V1 V2
1  1  6
2  4  9