How can I quickly see if any of the more than 2 vectors in R are equal?

(I expect this has already been asked / answered. If so, sorry, I canโ€™t find the answer.)

Say I have 6 vectors. How can I quickly check if any element for each vector is equal to any element of all other vectors?

I know I could do the following, and this seems very cumbersome / prehistoric / error prone:

any(vec1 %in% vec2, vec1 %in% vec3, vec1 %in% vec4, vec1 %in% vec5, vec1 %in% vec6,
    vec2 %in% vec3, vec2 %in% vec4, vec2 %in% vec5, vec2 %in% vec6,
    vec3 %in% vec4, vec3 %in% vec5, vec3 %in% vec6,
    vec4 %in% vec5, vec4 %in% vec6,
    vec5 %in% vec6)

Thank.

By the way, I checked How to find common elements from several vectors? and they seem to be asked to determine which elements are present in each vector, and not if any elements from any of the vectors are equal.

0
source share
2 answers

, :

# make sample data
set.seed(47)
x <- replicate(6, rpois(3, 10), simplify = FALSE) 

str(x)
# List of 6
#  $ : int [1:3] 16 12 10
#  $ : int [1:3] 9 10 6
#  $ : int [1:3] 10 14 4
#  $ : int [1:3] 7 6 4
#  $ : int [1:3] 12 8 7
#  $ : int [1:3] 7 11 8

lapply:

lapply(x, function(y){sapply(x, function(z){y %in% z})})

## [[1]]
##      [,1]  [,2]  [,3]  [,4]  [,5]  [,6]
## [1,] TRUE FALSE FALSE FALSE FALSE FALSE
## [2,] TRUE FALSE FALSE FALSE  TRUE FALSE
## [3,] TRUE  TRUE  TRUE FALSE FALSE FALSE
## 
## [[2]]
##       [,1] [,2]  [,3]  [,4]  [,5]  [,6]
## [1,] FALSE TRUE FALSE FALSE FALSE FALSE
## [2,]  TRUE TRUE  TRUE FALSE FALSE FALSE
## [3,] FALSE TRUE FALSE  TRUE FALSE FALSE
## ...    ...  ...   ...   ...   ...   ...

, , , , . , , - TRUE, .. TRUE . , . , sapply lapply.

, ,

str(lapply(x, function(y){which(sapply(x, function(z){any(y %in% z)}))}))

## List of 6
##  $ : int [1:4] 1 2 3 5
##  $ : int [1:4] 1 2 3 4
##  $ : int [1:4] 1 2 3 4
##  $ : int [1:5] 2 3 4 5 6
##  $ : int [1:4] 1 4 5 6
##  $ : int [1:3] 4 5 6

- . which .

+2

combn, , , %in%, any unlist

v1 <- unlist(combn(paste0("vec", 1:6), 2, FUN = function(x) 
             any(get(x[1]) %in% get(x[2])), simplify = FALSE))
names(v1) <- combn(paste0("vec", 1:6), 2, FUN = paste, collapse="-")

OP , combn , .


, combn list. , vector list, combn

v2 <- combn(mget(paste0("vec", 1:6)), 2, FUN = function(x) any(x[[1]] %in% x[[2]]))
names(v2) <- names(v1)

, OP any . any

any(combn(mget(paste0("vec", 1:6)), 2, FUN = function(x) x[[1]] %in% x[[2]]))

, .

vec1 <- 1:6
vec2 <- 2:3
vec3 <- 5:7
vec4 <- 6:8
vec5 <- 9:10
vec6 <- 11:12
+1

Source: https://habr.com/ru/post/1651949/


All Articles