假设我们想要检查矩阵(或数据帧)中哪些行存在于另一个中。我在这个基本操作中找到的所有解决方案似乎都需要一个库(这个{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()
效率不高..)
答案 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