在矩阵B中查找矩阵A的行索引

时间:2013-04-26 14:30:20

标签: r matrix indexing

让我们考虑两个矩阵A和B. A是B的子集。如何在矩阵B中找到A的每一行的索引? 这是一个可重现的例子:

set.seed(30)
B <- matrix(rnorm(n =30,mean = 0), ncol=3)
A <- subset(B, B[,1] > 1)

目标是找到索引idx,在这种情况下给出第4行和第5行。

4 个答案:

答案 0 :(得分:3)

嵌套apply循环应该这样做。

apply(A, 1, function(a)
   which(apply(B, 1, function(b) all(b==a)))
 )

# [1] 4 5

或者,使用colSums

apply(A, 1, function(a) 
    which(colSums(t(B) == a) == ncol(B)))
# [1] 4 5

答案 1 :(得分:0)

或者,你可以这样做:

transform(A, idx = 1 * duplicated(rbind(A, B))[-seq_len(nrow(A))])

一个不用的优秀解决方案,最初由@Arun提供。

答案 2 :(得分:0)

> match(apply(A, 1, paste, collapse="\b"), apply(B, 1, paste, collapse="\b"))
[1] 4 5

答案 3 :(得分:0)

这采用了稍微不同的方法,并依赖于矩阵是一个向量这一事实,如果你有data.frames它将不起作用:

which( B %in% A , arr.ind=TRUE )[1:nrow(A)]
#[1] 4 5

如果你有非常大的矩阵并希望提高效率,你可以在像这样的子集上使用%in%

which( B[1:nrow(B)] %in% A[1:nrow(A)] , arr.ind=TRUE )

但我不认为除了非常大的矩阵之外,这会产生太多差异。

如果您的数据为data.frames,那么您只需将第一列传递给which就可以做同样的事情:

A <- data.frame(A)
B <- data.frame(B)
which( B$X1 %in% A$X1 )
#[1] 4 5