%in%
Оператор говорит вам , какие элементы являются одними из numers удалить:
> a <- sample (1 : 10)
> remove <- c (2, 3, 5)
> a
[1] 10 5 2 7 1 6 3 4 8 9
> a %in% remove
[1] FALSE TRUE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
> a [! a %in% remove]
[1] 10 7 1 6 4 8 9
Обратите внимание, что это незаметно удалит несравнимые элементы (такие как NA
или) Inf)
(при этом будут сохраняться повторяющиеся значения, a
пока они не указаны в списке remove
).
Если a
может содержать несравнимые, но remove
не будет, мы можем использовать match
, сообщив ему, что нужно возвращать 0
несопоставимые и несравнимые ( %in%
это удобный ярлык для match
):
> a <- c (a, NA, Inf)
> a
[1] 10 5 2 7 1 6 3 4 8 9 NA Inf
> match (a, remove, nomatch = 0L, incomparables = 0L)
[1] 0 3 1 0 0 0 2 0 0 0 0 0
> a [match (a, remove, nomatch = 0L, incomparables = 0L) == 0L]
[1] 10 7 1 6 4 8 9 NA Inf
incomparables = 0
не требуется, так как несравненные в любом случае не будут совпадать, но я бы добавил его для удобства чтения.
Это, кстати, то, что setdiff
работает внутри (но без того, unique
чтобы выбросить дубликаты, в a
которых нет remove
).
Если remove
содержит несравненные, вам придется проверять их индивидуально, например
if (any (is.na (remove)))
a <- a [! is.na (a)]
(Это не отличает NA
от, NaN
но руководство R в любом случае предупреждает, что не следует полагаться на разницу между ними)
Для Inf
/ -Inf
вам нужно будет проверить оба sign
иis.finite
cbeleites недовольны SX
источник
setdiff
лучше, поскольку он делает все за одну операцию и ссылается на измененный вектор только один раз.a
, которыхremove
также нет. Если это не проблема, вы также можете использоватьsetdiff
.setdiff
, кстати, используетmatch
для этого%in%
ярлык.Вы можете использовать
setdiff
.Дано
затем
источник
a
это результат другой функции, поэтому вы можете делать что-то в одной строке вместо 3 и временной переменной%in%
решение, если входной вектор содержит дубликаты (и в этом случаеsetdiff
будет возвращен только уникальный набор , то есть без дубликатов)fsetdiff
уdata.table
пакета естьall
флаг (по умолчанию F), который позволяет сохранять дубликаты во входном векторе.Сделать это можно следующим образом:
вскоре
источник
which
. Это в основном то же самое, что и ответ @cbeleites.which
возвращает индексы ИСТИННЫХ значений. Таким образом, знак минус может использоваться, чтобы сказать «индексы, отличные от этих индексов». Такжеwhich
он более читабелен, поскольку он ближе к естественному языку.вместо того
используя пакеты
purrr
иmagrittr
, вы можете:это позволяет
subset
использовать имя вектора только один раз. И можно использовать в трубах :)источник
Сначала мы можем определить новый оператор,
Тогда это похоже на x не в удалении
или зачем идти на удаление, идти прямо
источник
ОБНОВИТЬ:
Все приведенные выше ответы не будут работать для повторяющихся значений, ответ @BenBolker с использованием
duplicated()
предиката решает это:Исходный ответ: здесь я пишу для этого небольшую функцию:
так, скажем так
full_vector=c(1,2,3,4,1)
иsearched_vector=c(1,2,3)
.exclude_val(full_vector,searched_vector)
вернет (4,1), однако приведенные выше ответы вернутся просто(4)
.источник
full_vector[!full_vector %in% searched_vector | duplicated(full_vector)]
?full_vector = c(1,1,1,2,3); searched_vector = c(1,1,3);
-1, 1, 2
вместо правильного ответа1, 2
.removeif <- function(from, where) { for (i in where) if (i %in% from) {from = from[-match(i, from)]}; from}
Это устанавливает 13 в векторе как не число (NAN), это показывает ложное удаление (q [c (11,12,13)]), если вы попробуете это, вы увидите, что функция удаления не работает с векторным номером. вы удаляете весь вектор, но, возможно, ни один элемент.
источник
Также
subset
иногда могут быть полезны:источник