4

让我们考虑两个矩阵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

4 回答 4

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
于 2013-04-26T14:33:54.180 回答
0
> match(apply(A, 1, paste, collapse="\b"), apply(B, 1, paste, collapse="\b"))
[1] 4 5
于 2013-04-26T16:52:05.020 回答
0

或者,您可以这样做:

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

一个没有应用的好解决方案,最初由@Arun 提供。

于 2013-04-26T14:56:33.910 回答
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
于 2013-04-26T17:07:25.927 回答