首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高效而优雅地检查一个矩阵的哪些行存在于另一个矩阵中

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

Stack Overflow用户
提问于 2015-01-30 20:56:01
回答 1查看 104关注 0票数 0

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

代码语言:javascript
复制
(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()的效率不高。)

EN

回答 1

Stack Overflow用户

发布于 2015-01-30 21:24:26

this answer中,您可以使用match:

代码语言:javascript
复制
> 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的结果以适合您的首选格式:

代码语言:javascript
复制
> !is.na(m)
[1]  TRUE FALSE FALSE  TRUE FALSE
> which(!is.na(m))
[1] 1 4

您可以使用这些变体中的任何一种来检索行:

代码语言:javascript
复制
> m1[!is.na(m),]
     [,1] [,2]
[1,]    1    6
[2,]    4    9

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

代码语言:javascript
复制
> merge(m1, m2)
  V1 V2
1  1  6
2  4  9
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28236424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档