有效而优雅地检查另一行中存在哪些矩阵行

时间:2015-01-30 12:56:01

标签: r

假设我们想要检查矩阵(或数据帧)中哪些行存在于另一个中。我在这个基本操作中找到的所有解决方案似乎都需要一个库(这个{data.table} 4-liner)或者是冗长而模糊的,例如:

(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()效率不高..)

1 个答案:

答案 0 :(得分:2)

this answer您可以使用匹配:

> 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

您可以轻松更改match的结果以适合您的首选格式:

> !is.na(m)
[1]  TRUE FALSE FALSE  TRUE FALSE
> which(!is.na(m))
[1] 1 4

您可以使用以下任何变体检索行:

> m1[!is.na(m),]
     [,1] [,2]
[1,]    1    6
[2,]    4    9

但如果您真的想要而不是索引,只需使用merge(返回data.frame):

> merge(m1, m2)
  V1 V2
1  1  6
2  4  9