Поиск элементов в векторе, которые дублируются или которых нет в другом векторе

У меня следующая ситуация:

vec1  <- c("A", "B", "D", "C", "E", "A", "C")
vec2 <- c("A", "B", "C", "D", "F")

Первый вопрос: какой дублируется? - ответьте "A" и "C" для vec1, 0 для vec2

Второй вопрос: Определите, какой из vec1, но не vec2, независимо от порядка (ответ "E")

или наоборот (ответ "F")

which(vec1 !=vec2)
which(vec2 !=vec1)

[1] 3 4 5 7
Warning message:
In vec1 != vec2 :
  longer object length is not a multiple of shorter object length

чего я не ожидал....

3 ответа

Решение

Элементы в vec1, которые дублируются:

vec1[duplicated(vec1)]

[1] "A" "C"

Элементы в vec1, которых нет в vec2:

vec1[is.na(match(vec1,vec2))]

[1] "E"

И наоборот:

vec2[is.na(match(vec1,vec2))]

[1] "F"

По первому вопросу попробуйте ?duplicated

vec1.dup <- duplicated(vec1)
unique(vec1[vec1.dup])

[1] "A" "C"

Для второго попробуйте ?setdiff, Вам нужны значения vec2, которых нет в vec1.

setdiff(vec2, vec1)
[1] "F"

Похоже, что ваш (второй) вопрос... Почему? (Я вижу, что вы получили хорошие ответы на правильные... Как?)

which(vec1 !=vec2)
which(vec2 !=vec1)

Оба возвращаются

[1] 3 4 5 7

Ответ лежит в основном в предупреждающем сообщении, которое вы не включили:

Warning message:
In vec1 != vec2 :
  longer object length is not a multiple of shorter object length

Когда двоичные операторы, такие как "!=", Работают с векторами, правила рециркуляции вступают во владение, поэтому более длинный из двух векторов определяет "диапазон" для сравнений, а более короткий - расширяется путем рециркуляции. Вы заканчиваете тестированием:

> c("A", "B", "C", "D", "F", "A", "B") != c("A", "B", "D", "C", "E", "A", "C")
                                         #.... extending shorter one ^^^^^^^
[1] FALSE FALSE  TRUE  TRUE  TRUE FALSE  TRUE
> c("A", "B", "D", "C", "E","A", "C") !=  c("A", "B", "C", "D", "F", "A", "B")
#.... extending shorter one ^^^^^^^
[1] FALSE FALSE  TRUE  TRUE  TRUE FALSE  TRUE
Другие вопросы по тегам