r-将矩阵的行与另一个矩阵的行匹配,而不考虑列顺序



我有两个矩阵,我需要找出一个矩阵中的两列集是否出现在另一个矩阵,而不考虑顺序(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}。

我尝试过mergeintersectsetdiff,但它们都不会返回所有可能的匹配项。

> 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,]
返回行号X

我们可以在每个数据集上逐行sort

x1 <- t(apply(X, 1, sort))
y1 <- t(apply(Y, 1, sort))

然后对每个数据集的CCD_ 6d行进行CCD_

match(do.call(paste, as.data.frame(y1)), do.call(paste, as.data.frame(x1)))
#[1] 1 4 9

您可以使用merge方法,该方法是在对每一行进行排序并证明X数据帧的行索引后尝试的。

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

最新更新