如果向量之间有公共元素/没有公共元素,则返回 TRUE/FALSE

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

提问人:ravinglooper 提问时间:5/10/2022 最后编辑:Maëlravinglooper 更新时间:9/5/2022 访问量:630

问:

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

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

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

R 向量 相交

评论


答:

5赞 Maël 5/10/2022 #1

您可以使用:any

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

any(vec %in% vec2)
#[1] TRUE
2赞 Quinten 5/10/2022 #2

另一种选择:

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

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

输出:

[1] TRUE

评论

1赞 ravinglooper 5/13/2022
这里所有正确的答案,但这个解决方案适用于我需要的。group_by
1赞 M-- 5/14/2022
所有解决方案都适用于 group_by。
3赞 M-- 5/10/2022 #3

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

!!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
3赞 AndrewGB 5/10/2022 #4

这是另一个使用 with 的选项: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)
3赞 s_baldur 5/10/2022 #5

再来一个 不是很好的选择:

anyDuplicated( c(unique(vec), unique(vec2)) ) > 0
# [1] TRUE
3赞 TarJae 5/10/2022 #6

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

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

第一个答案:还有一个否定:all

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

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

评论

1赞 M-- 5/13/2022
如果根本没有匹配项,则返回此值。
0赞 TarJae 5/13/2022
谢谢你指出这一点!其工作原理如下:!all(!v1 %in% v2)
1赞 M-- 5/13/2022
!all(!(v1 %in% v2))