R::How 我是否会将一个矩阵的行与另一个矩阵的行匹配,而不考虑列顺序?
R::How would I match the rows of one matrix to the rows in another matrix, regardless of the column order?
我有两个矩阵,我需要找出一个矩阵中的两列集合是否出现在另一个矩阵中而不考虑顺序(A:B = B:A)。
例如,这里有两个矩阵:
X <- matrix(c(23, 33, 4, 21, 5, 27, 47, 39, 37, 8, 30, 42, 59, 63, 53, 50, 49, 65, 53, 59), nrow = 10, ncol = 2, byrow = F)
Y <- matrix(c(30, 21, 53, 23, 63, 37), nrow = 3, ncol = 2, byrow = F)
> X
[,1] [,2]
[1,] 23 30
[2,] 33 42
[3,] 4 59
[4,] 21 63
[5,] 5 53
[6,] 27 50
[7,] 47 49
[8,] 39 65
[9,] 37 53
[10,] 8 59
> Y
[,1] [,2]
[1,] 30 23
[2,] 21 63
[3,] 53 37
例如,我希望能够在 X 中找到 Y[1,],无论它是 {30,23} 还是 {23,30}。
我已经尝试了 merge
、intersect
和 setdiff
,但是 none 将 return 所有可能的匹配项。
> merge(data.frame(X),data.frame(Y))
X1 X2
1 21 63
> merge(data.frame(Y),data.frame(X))
X1 X2
1 21 63
> intersect(data.frame(X),data.frame(Y))
X1 X2
1 21 63
> intersect(data.frame(Y),data.frame(X))
X1 X2
1 21 63
> setdiff(data.frame(Y),data.frame(X))
X1 X2
1 30 23
2 53 37
> setdiff(data.frame(X),data.frame(Y))
X1 X2
1 23 30
2 33 42
3 4 59
4 5 53
5 27 50
6 47 49
7 39 65
8 37 53
9 8 59
最终目标是识别 X 中包含匹配项(有或没有内容)的行。所以,在伪代码中,它将是:
对于 X
中的每个 Y[i,]
return 行号 X
如有任何帮助,我们将不胜感激。
我们可以在每个数据集上按行sort
x1 <- t(apply(X, 1, sort))
y1 <- t(apply(Y, 1, sort))
然后对每个数据集的 paste
d 行执行 match
以 return 匹配的行索引
match(do.call(paste, as.data.frame(y1)), do.call(paste, as.data.frame(x1)))
#[1] 1 4 9
您可以使用您在对每一行进行排序并证明 X
数据帧的行索引之后尝试的 merge
方法。
x1 <- transform(data.frame(t(apply(X, 1, sort))), row = 1:nrow(X))
y1 <- data.frame(t(apply(Y, 1, sort)))
merge(x1, y1)
# X1 X2 row
#1 21 63 4
#2 23 30 1
#3 37 53 9
我有两个矩阵,我需要找出一个矩阵中的两列集合是否出现在另一个矩阵中而不考虑顺序(A:B = B:A)。
例如,这里有两个矩阵:
X <- matrix(c(23, 33, 4, 21, 5, 27, 47, 39, 37, 8, 30, 42, 59, 63, 53, 50, 49, 65, 53, 59), nrow = 10, ncol = 2, byrow = F)
Y <- matrix(c(30, 21, 53, 23, 63, 37), nrow = 3, ncol = 2, byrow = F)
> X
[,1] [,2]
[1,] 23 30
[2,] 33 42
[3,] 4 59
[4,] 21 63
[5,] 5 53
[6,] 27 50
[7,] 47 49
[8,] 39 65
[9,] 37 53
[10,] 8 59
> Y
[,1] [,2]
[1,] 30 23
[2,] 21 63
[3,] 53 37
例如,我希望能够在 X 中找到 Y[1,],无论它是 {30,23} 还是 {23,30}。
我已经尝试了 merge
、intersect
和 setdiff
,但是 none 将 return 所有可能的匹配项。
> merge(data.frame(X),data.frame(Y))
X1 X2
1 21 63
> merge(data.frame(Y),data.frame(X))
X1 X2
1 21 63
> intersect(data.frame(X),data.frame(Y))
X1 X2
1 21 63
> intersect(data.frame(Y),data.frame(X))
X1 X2
1 21 63
> setdiff(data.frame(Y),data.frame(X))
X1 X2
1 30 23
2 53 37
> setdiff(data.frame(X),data.frame(Y))
X1 X2
1 23 30
2 33 42
3 4 59
4 5 53
5 27 50
6 47 49
7 39 65
8 37 53
9 8 59
最终目标是识别 X 中包含匹配项(有或没有内容)的行。所以,在伪代码中,它将是:
对于 X
中的每个 Y[i,]
return 行号 X
如有任何帮助,我们将不胜感激。
我们可以在每个数据集上按行sort
x1 <- t(apply(X, 1, sort))
y1 <- t(apply(Y, 1, sort))
然后对每个数据集的 paste
d 行执行 match
以 return 匹配的行索引
match(do.call(paste, as.data.frame(y1)), do.call(paste, as.data.frame(x1)))
#[1] 1 4 9
您可以使用您在对每一行进行排序并证明 X
数据帧的行索引之后尝试的 merge
方法。
x1 <- transform(data.frame(t(apply(X, 1, sort))), row = 1:nrow(X))
y1 <- data.frame(t(apply(Y, 1, sort)))
merge(x1, y1)
# X1 X2 row
#1 21 63 4
#2 23 30 1
#3 37 53 9