我无法相信这需要我这么长时间才弄明白,我仍然无法理解。
我需要保留一组向量,然后检查该集合中是否存在某个向量。我尝试了与%in%
结合使用的列表,但这似乎无法正常工作。
我的下一个想法是创建一个矩阵和rbind
向量,但现在我不知道如何检查向量是否包含在矩阵中。 %in
似乎比较集合而不是精确行。相同似乎适用于交叉。
非常感谢!
答案 0 :(得分:8)
你的意思是这样的:
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
编辑:快速评论为何我使用isTRUE()
围绕all.equal()
来电。这是因为两个参数不相等,all.equal()
不返回逻辑值(FALSE
):
> all.equal(1:3, c(3,2,1))
[1] "Mean relative difference: 1"
isTRUE()
在这里很有用,因为它返回TRUE
iff它的参数是TRUE
,而如果它是其他任何东西则返回FALSE
。
答案 1 :(得分: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])
这是一种在两个以上的元素上使用intersect()的方法
> intersect(intersect(c1, c2), c3)
[1] 2