Поиск элементов в векторе, которые дублируются или которых нет в другом векторе
У меня следующая ситуация:
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