Return TRUE/FALSE if common elements/no 向量之间的公共元素

Return TRUE/FALSE if common elements/no common elements between vectors

我正在寻找一种创建布尔向量的有效方法,如果 个指定变量中的一个或多个,则 returns TRUE 例如c(1,2,3) 在另一个向量中,例如c(4,5,6,1).

在此示例中,寻求的输出将是 TRUE,因为元素 1 存在于两个向量中。

据我所知 %in% 一次只允许检查一个变量,考虑到我需要检查的潜在变量的数量,在这种情况下使用 | 运算符效率低下。使用 intersect() returns logical(0) 而不是 FALSEsum(c(1,2,3) == c(4,5,6,1)) > 1 returns FALSE 因为公共元素不在同一位置.

您可以使用 any:

vec <- c(1,2,3)
vec2 <- c(4,5,6,1)

any(vec %in% vec2)
#[1] TRUE

另一个选项:

vector1 <- c(1,2,3)
vector2 <- c(4,5,6,1)

any(Reduce(intersect, list(vector1, vector2)))

输出:

[1] TRUE

使用 any 是最有效的方法,但只是为了提供另一种解决方案,这里是使用 sum 的方法:

!!sum(c(1,2,3) %in% c(4,5,6,1))

 # [1] TRUE

或者我们可以使用 length:

length(base::intersect(c(1,2,3), c(4,5,6,1))) != 0

这是另一个使用 is.elementany 的选项:

vec1 <- c(1,2,3)
vec2 <- c(4,5,6,1)

any(is.element(vec1, vec2))

# [1] TRUE

或者另一种选择是将 matchany 一起使用(尽管效率可能较低):

any(match(vec1, vec2), na.rm = TRUE)

还有一个 不是很好的选择:

anyDuplicated( c(unique(vec), unique(vec2)) ) > 0
# [1] TRUE

更新: 正如@M 所评论的——如果没有匹配,它会返回 TRUE!以下是如何避免这种情况:

!all(!(v1 %in% v2))

第一个回答: 另一个否定 all:

v1 <- c(1,2,3)
v2 <- c(4,5,6,1)

!all(v1 %in% v2)
[1] TRUE