Перекрестная проверка * множественных * векторов друг на друга, чтобы проверить, существуют ли все элементы во всех векторах - PullRequest
0 голосов
/ 28 июня 2019

У меня есть несколько наборов (векторов), которые должны включать в себя одни и те же элементы. Теоретически они должны, но на самом деле, я подозреваю, что в некоторых векторах отсутствуют некоторые элементы.

Все методы, которые я видел для такого рода проблемы, решают двухвекторную ситуацию, но не применимы при наличии нескольких векторов.

Короче говоря, я ищу применение setequal() для нескольких векторов, так как ни уникальность, ни порядок не имеют значения для меня.

Вот пример:

#Six sets of characters&numbers that are pretty similar, though not identical
vec_a <- unlist(strsplit("Z d 5 A P y 4 R 6 y w u N T b", split=" "))
vec_b <- unlist(strsplit("Z d 5 B P y 4 R 6 y w u N T b", split=" "))
vec_c <- unlist(strsplit("Z d 5 A P y 4 R 6 y w u N T b", split=" "))
vec_d <- unlist(strsplit("Z d 5 A P x 4 R 6 y w u N W b", split=" "))
vec_e <- unlist(strsplit("Z d 5 A P y 4 R 6 y w u N T b", split=" "))
vec_f <- unlist(strsplit("Z d 5 A P y 4 R 6 y w u N T b", split=" "))

#I want to cross check all 6 sets against each other, 
#to see whether all elements appear in all sets (order doesn't matter, nor uniquness), 
#OR whether some elements DON'T exist in some of the sets. I'd like
#to flag the elements that don't appear in all 6 sets.


#As a start, I just want to get a TRUE/FALSE answer to whether
#all elements appear in all 6 vectors.
Reduce(setequal, list(vec_a, vec_b, vec_c, vec_d, vec_e, vec_f))
[1] FALSE

#It DOES make sense to get that FALSE returned, because 
#not all 6 vectors are the same. 
#HOWEVER, note that vec_a, vec_e, and vec_f ARE IDENTICAL, 
#but when running the following command, I still get FALSE, which doesn't make sense.
Reduce(setequal, list(vec_a, vec_e, vec_f))
[1] FALSE
#So this method clearly doesn't work accurately. 

Есть идеи?

Спасибо!

1 Ответ

1 голос
/ 28 июня 2019

Вы можете найти все общие элементы с:

l <- list(vec_a, vec_b, vec_c, vec_d, vec_e, vec_f)
( common <- Reduce(intersect, l) )
#  [1] "Z" "d" "5" "P" "y" "4" "R" "6" "w" "u" "N" "b"

(что напоминает, что вы, возможно, захотите, чтобы они хранились в list для начала, а не в отдельных векторах, но это, как всегда, зависит от вашего общего проекта / приложения.)

Чтобы узнать, что у каждого вектора отличается от этого общего списка:

lapply(l, setdiff, common)
# [[1]]
# [1] "A" "T"
# [[2]]
# [1] "B" "T"
# [[3]]
# [1] "A" "T"
# [[4]]
# [1] "A" "x" "W"
# [[5]]
# [1] "A" "T"
# [[6]]
# [1] "A" "T"

(В этом примере было бы лучше, если бы элементы list были названы так, чтобы вы знали, что было каким ... поэтому вы можете решить эту проблему при создании списка l. )

Вы можете найти, какие пары идентичны с:

outer(seq_along(l), seq_along(l),
      function(a,b) mapply(function(A,B) identical(l[[A]], l[[B]]), a, b))
#       [,1]  [,2]  [,3]  [,4]  [,5]  [,6]
# [1,]  TRUE FALSE  TRUE FALSE  TRUE  TRUE
# [2,] FALSE  TRUE FALSE FALSE FALSE FALSE
# [3,]  TRUE FALSE  TRUE FALSE  TRUE  TRUE
# [4,] FALSE FALSE FALSE  TRUE FALSE FALSE
# [5,]  TRUE FALSE  TRUE FALSE  TRUE  TRUE
# [6,]  TRUE FALSE  TRUE FALSE  TRUE  TRUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...