在R中检查一个向量是否包含在矩阵中

4

我简直不敢相信我花了这么长时间去弄清楚,但我仍然无法弄清楚。

我需要保留一组向量,并稍后检查是否有特定的向量在其中。我尝试使用与%in%相结合的列表,但似乎无法正常工作。

我的下一个想法是创建一个矩阵并将向量rbind到它上面,但现在我不知道如何检查矩阵中是否包含向量。 %in似乎比较集合而不是精确行。相同的情况似乎也适用于交集。

非常感谢您的帮助!


1
请问使用的编程语言是什么? - kellogs
2个回答

11

您的意思是这样吗:

wantVec <- c(3,1,2)
myList <- list(A = c(1:3), B = c(3,1,2), C = c(2,3,1))
sapply(myList, function(x, want) isTRUE(all.equal(x, want)), wantVec)
## or, is the vector in the set?
any(sapply(myList, function(x, want) isTRUE(all.equal(x, want)), wantVec))
我们可以使用矩阵来完成类似的事情:
myMat <- matrix(unlist(myList), ncol = 3, byrow = TRUE)
## As the vectors are now in the rows, we use apply over the rows
apply(myMat, 1, function(x, want) isTRUE(all.equal(x, want)), wantVec)
## or
any(apply(myMat, 1, function(x, want) isTRUE(all.equal(x, want)), wantVec))

或者按列:

myMat2 <- matrix(unlist(myList), ncol = 3)
## As the vectors are now in the cols, we use apply over the cols
apply(myMat, 2, function(x, want) isTRUE(all.equal(x, want)), wantVec)
## or
any(apply(myMat, 2, function(x, want) isTRUE(all.equal(x, want)), wantVec))

如果你需要经常这样做,就编写自己的函数

vecMatch <- function(x, want) {
    isTRUE(all.equal(x, want))
}

然后在列表 myList 上使用它:

> sapply(myList, vecMatch, wantVec)
    A     B     C 
FALSE  TRUE FALSE 
> any(sapply(myList, vecMatch, wantVec))
[1] TRUE

甚至可以将整个东西包装起来:

vecMatch <- function(x, want) {
    out <- sapply(x, function(x, want) isTRUE(all.equal(x, want)), want)
    any(out)
}

> vecMatch(myList, wantVec)
[1] TRUE
> vecMatch(myList, 5:3)
[1] FALSE

编辑: 关于我为什么在all.equal()调用周围使用了isTRUE()的快速评论。这是因为当两个参数不相等时,all.equal()不会返回逻辑值(FALSE):

> all.equal(1:3, c(3,2,1))
[1] "Mean relative difference: 1"

isTRUE() 在这里很有用,因为它只有在其参数为 TRUE 时返回 TRUE,否则返回 FALSE


0
> M
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9


 v <- c(2, 5, 8)

检查每一列:

 c1 <- which(M[, 1] == v[1])
 c2 <- which(M[, 2] == v[2])
 c3 <- which(M[, 3] == v[3])

这里有一种方法可以在超过2个元素上仍然使用intersect()函数。
> intersect(intersect(c1, c2), c3)

[1] 2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接