提问人:ravinglooper 提问时间:5/10/2022 最后编辑:Maëlravinglooper 更新时间:9/5/2022 访问量:630
如果向量之间有公共元素/没有公共元素,则返回 TRUE/FALSE
Return TRUE/FALSE if common elements/no common elements between vectors
问:
我正在寻找一种有效的方法来创建一个布尔向量,如果一个或多个指定变量中的一个或多个,则返回该向量,例如 在另一个向量中,例如 .TRUE
c(1,2,3)
c(4,5,6,1)
在此示例中,所寻求的输出将是因为元素存在于两个向量中。TRUE
1
据我所知,一次只允许检查一个变量,在这种情况下,考虑到我需要检查的潜在变量的数量,使用运算符是低效的。使用 return 而不是 ,并且 return 作为公共元素不在同一位置。%in%
|
intersect()
logical(0)
FALSE
sum(c(1,2,3) == c(4,5,6,1)) > 1
FALSE
答:
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
使用是最有效的方法,但只是为了提供另一种解决方案,这里有一个使用: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
3赞
AndrewGB
5/10/2022
#4
这是另一个使用 with 的选项:is.element
any
vec1 <- c(1,2,3)
vec2 <- c(4,5,6,1)
any(is.element(vec1, vec2))
# [1] TRUE
或者另一种选择是与(尽管效率可能较低):match
any
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))
评论