%in%
Operator informuje, które elementy należą do numers do usunięcia:
> 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
Zauważ, że to po cichu usunie nieporównywalne elementy (takie jak NA
lub Inf)
również (podczas gdy zachowa zduplikowane wartości, a
o ile nie są wymienione remove
).
Jeśli a
może zawierać nieporównywalne, ale remove
nie będzie, możemy użyć match
, mówiąc mu, aby zwracał 0
po niedopasowania i nieporównywalne ( %in%
jest to wygodny skrót do 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
nie jest potrzebne, ponieważ elementy nieporównywalne i tak nie będą pasować, ale dołączyłbym to ze względu na czytelność.
To jest przy okazji, co setdiff
robi wewnętrznie (ale bez unique
wyrzucania duplikatów, w a
których nie ma remove
).
Jeśli remove
zawiera nieporównywalne elementy, będziesz musiał sprawdzić je indywidualnie, np
if (any (is.na (remove)))
a <- a [! is.na (a)]
(To nie odróżnia NA
od NaN
ale instrukcja R jakikolwiek ostrzega, że nie należy liczyć na o różnicę między nimi)
Dla Inf
/ -Inf
będziesz musiał sprawdzić zarówno sign
iis.finite
cbeleites niezadowolony z SX
źródło
setdiff
jest lepsze, ponieważ robi wszystko w jednej operacji i odwołuje się do zmienionego wektora tylko raz.a
których również nie maremove
. Jeśli to nie problem, możesz również użyćsetdiff
.setdiff
, przy okazji, używamatch
do którego%in%
jest skrót.Możesz użyć
setdiff
.Dany
Następnie
źródło
a
jest wynikiem innej funkcji, więc możesz robić rzeczy w jednej linii zamiast 3 i zmiennej tymczasowej%in%
rozwiązanie, jeśli wektor wejściowy zawiera duplikaty (w takim przypadkusetdiff
zwróci tylko unikalny zestaw , tj. Bez duplikatów)fsetdiff
ofdata.table
package maall
flagę (domyślnie F), która pozwala zachować duplikaty w wektorze wejściowym.Możesz to zrobić w następujący sposób:
Wkrótce
źródło
which
. Zasadniczo jest to to samo, co odpowiedź @cbeleites.which
zwraca indeksy wartości PRAWDA. Tak więc znak minus może być użyty do określenia „indeksów innych niż te indeksy”.which
Jest też bardziej czytelny, ponieważ jest bliżej języka naturalnego.zamiast
korzystając z pakietów
purrr
imagrittr
możesz:pozwala to na
subset
jednorazowe użycie nazwy wektora. I możesz go używać w rurach :)źródło
Najpierw możemy zdefiniować nowy operator,
Wtedy to jak x nie jest usuwane
lub dlaczego zdecydować się na usunięcie, przejdź bezpośrednio
źródło
AKTUALIZACJA:
Wszystkie powyższe odpowiedzi nie będą działać dla powtarzających się wartości, odpowiedź @ BenBolker za pomocą
duplicated()
predykatu rozwiązuje ten problem:Oryginalna odpowiedź: tutaj napiszę małą funkcję:
więc powiedzmy
full_vector=c(1,2,3,4,1)
isearched_vector=c(1,2,3)
.exclude_val(full_vector,searched_vector)
zwróci (4,1), jednak powyższe odpowiedzi zwrócą tylko(4)
.źródło
full_vector[!full_vector %in% searched_vector | duplicated(full_vector)]
?full_vector = c(1,1,1,2,3); searched_vector = c(1,1,3);
- to produkuje1, 1, 2
zamiast poprawnej odpowiedzi1, 2
.removeif <- function(from, where) { for (i in where) if (i %in% from) {from = from[-match(i, from)]}; from}
To ustawia 13 w wektorze na nie liczbę (NAN), pokazuje fałszywe usuwanie (q [c (11,12,13)]). Jeśli spróbujesz tego, zobaczysz, że funkcja usuwania nie działa na numerze wektora. usuwasz cały wektor, ale może nie pojedynczy element.
źródło
Jest też
subset
coś, co czasami może się przydać:źródło