假设我们想检查一个矩阵(或数据帧)中的哪些行存在于另一个矩阵(或数据帧)中。我找到的这个基本操作的所有解决方案似乎要么需要一个库(这个{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()的效率不高。)
发布于 2015-01-30 21:24:26
在this answer中,您可以使用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您可以轻松地更改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 9https://stackoverflow.com/questions/28236424
复制相似问题