Я хочу знать точные элементы вектора, не найденные в векторе. Например, рассмотрим следующие векторы:
veca <- c("ab", "cd", "ef", "gh", "ij", "kl")
vecb <- c("ab", "ef", "ij", "kl")
Отсюда cd
и gh
находятся в veca
, но не в vecb
. Как можно идентифицировать эти элементы в R? Спасибо!
Отвечает ли это на ваш вопрос? Сравните два вектора символов в R
Вы можете использовать встроенную функцию setdiff()
Пример:
veca <- c("ab", "cd", "ef", "gh", "ij", "kl")
vecb <- c("ab", "ef", "ij", "kl")
print(setdiff(veca, vecb))
Выход:
[1] "cd" "gh"
Мы могли бы определить пользовательскую функцию, например функцию противоположного пересечения, используя setdiff
:
узнал здесь:
outersect <- function(x, y) {
sort(c(setdiff(x, y),
setdiff(y, x)))
}
outersect(veca, vecb)
выход:
[1] "cd" "gh"
Другое возможное решение:
not_in_vecb <- veca[!veca %in% vecb]
[1] "cd" "gh"
Вы можете использовать оператор %in%
Определение элементов в veca
, которых нет в vecb
> veca[!(veca %in% vecb)]
[1] "cd" "gh"
Здесь мы рассмотрим несколько более общий случай
veca <- c("ab", "cd", "ef", "gh", "ij", "kl") # "cd" and "gh" are not in `vecb`
vecb <- c("ab", "ef", "ij", "kl", "xy") # "xy" is not in `veca`
Ниже приведены некоторые варианты, которые мы можем попробовать
set
операции: union
, setdiff
и intersect
> setdiff(union(veca, vecb), intersect(veca, vecb))
[1] "cd" "gh" "xy"
stack
+ subset
, чтобы отфильтровать, чье вхождение просто 1
subset(
aggregate(
ind ~ .,
stack(list(a = veca, b = vecb)),
unique
),
lengths(ind) == 1,
select = values
)
который дает
values
2 cd
4 gh
7 xy
not_in_vecb <- veca[!veca %in% vecb]