如何获得两个矩阵的交集?
How do I get the intersect of two matrices?
# These are the two matrices that I would like to subset based on identical
# entries within entire rows.
mata <- matrix(c("A", "B", "C", "F", "D", "E", "F", "G"),
nrow = 4, ncol = 2,
dimnames = list(c(), c("A", "B")))
mata
## A B
## [1,] "A" "D"
## [2,] "B" "E"
## [3,] "C" "F"
## [4,] "F" "G"
matb <- matrix(c("B", "A", "C", "F", "M", "D", "D", "H", "G", "X"),
nrow = 5, ncol = 2,
dimnames = list(c(), c("A", "B")))
matb
## A B
## [1,] "B" "D"
## [2,] "A" "D"
## [3,] "C" "H"
## [4,] "F" "G"
## [5,] "M" "X"
如果两个矩阵不是无序的且长度相同,则
以下代码应该可以工作并且效率很高。
mata[rowMeans(mata == matb) == 1, ]
我的一个骇人听闻的解决方案是将个体串联起来
我想用于匹配的每个矩阵的列。在这个
例如,我将使用所有列。
mata <- cbind(mata, C = paste0(mata[, "A"], "_", mata[, "B"]))
matb <- cbind(matb, C = paste0(matb[, "A"], "_", matb[, "B"]))
mata[mata[, "C"] %in% matb[, "C"], colnames(mata) != "C"]
## A B
## [1,] "A" "D"
## [2,] "F" "G"
这是我正在寻找的结果,但我想知道是否
还有一些更优雅的东西,例如向量的 %in%
函数。
编辑
该解决方案应适用于矩阵不适用的一般情况
必须等长。
您可以为此使用函数 merge()
:
> merge(mata,matb)
A B
1 A D
2 F G
如果加载dplyr,则添加intersect.data.frame
:
library(dplyr)
options(stringsAsFactors=FALSE)
dfa <- as.data.frame(mata)
dfb <- as.data.frame(matb)
intersect(dfa,dfb)
# A B
# 1 A D
# 2 F G
同样,union
、setequal
(测试集相等)和setdiff
(集减)可用。
旁白。 data.frame 的每一行对应一个观察值,因此谈论交叉两组观察值(两个 data.frame秒)。然而,对于矩阵来说,它确实没有意义。这就是为什么如果您想继续使用矩阵,则此操作需要像 OP 的解决方案和 @RHertel 的解决方案(在幕后强制 data.frame)的原因。
# These are the two matrices that I would like to subset based on identical
# entries within entire rows.
mata <- matrix(c("A", "B", "C", "F", "D", "E", "F", "G"),
nrow = 4, ncol = 2,
dimnames = list(c(), c("A", "B")))
mata
## A B
## [1,] "A" "D"
## [2,] "B" "E"
## [3,] "C" "F"
## [4,] "F" "G"
matb <- matrix(c("B", "A", "C", "F", "M", "D", "D", "H", "G", "X"),
nrow = 5, ncol = 2,
dimnames = list(c(), c("A", "B")))
matb
## A B
## [1,] "B" "D"
## [2,] "A" "D"
## [3,] "C" "H"
## [4,] "F" "G"
## [5,] "M" "X"
如果两个矩阵不是无序的且长度相同,则 以下代码应该可以工作并且效率很高。
mata[rowMeans(mata == matb) == 1, ]
我的一个骇人听闻的解决方案是将个体串联起来 我想用于匹配的每个矩阵的列。在这个 例如,我将使用所有列。
mata <- cbind(mata, C = paste0(mata[, "A"], "_", mata[, "B"]))
matb <- cbind(matb, C = paste0(matb[, "A"], "_", matb[, "B"]))
mata[mata[, "C"] %in% matb[, "C"], colnames(mata) != "C"]
## A B
## [1,] "A" "D"
## [2,] "F" "G"
这是我正在寻找的结果,但我想知道是否
还有一些更优雅的东西,例如向量的 %in%
函数。
编辑
该解决方案应适用于矩阵不适用的一般情况 必须等长。
您可以为此使用函数 merge()
:
> merge(mata,matb)
A B
1 A D
2 F G
如果加载dplyr,则添加intersect.data.frame
:
library(dplyr)
options(stringsAsFactors=FALSE)
dfa <- as.data.frame(mata)
dfb <- as.data.frame(matb)
intersect(dfa,dfb)
# A B
# 1 A D
# 2 F G
同样,union
、setequal
(测试集相等)和setdiff
(集减)可用。
旁白。 data.frame 的每一行对应一个观察值,因此谈论交叉两组观察值(两个 data.frame秒)。然而,对于矩阵来说,它确实没有意义。这就是为什么如果您想继续使用矩阵,则此操作需要像 OP 的解决方案和 @RHertel 的解决方案(在幕后强制 data.frame)的原因。