Sprawdź, czy wektor zawiera dany element

518

Jak sprawdzić, czy wektor zawiera daną wartość?

medriscoll
źródło
38
czasami zadaję sobie pytanie, dlaczego R po prostu nie używa słowa zawiera, aby ułatwić użytkownikom
greg121
12
rozważ, że „in” jest zawarte w „conta (in) s”; Twierdziłbym, że „in” jest w tym kontekście dość zwięzłym konkurentem
hedgedandleught
1
Być może po dodaniu %znaków flankujących . To słowo injest zarezerwowane w języku R do użycia w konstrukcji pętli.
IRTFM,
@ greg121 dplyr ma już funkcję zawierającą , ale jest używana do innego celu: do wybrania kolumny w ramce danych. Na przykład select(iris, contains("etal")).
Paul Rougieux
Czy istnieje zwięzły sposób na wykonanie liczb rzeczywistych z określoną precyzją?
mlt

Odpowiedzi:

500

Służą do tego zarówno funkcje match()(zwraca pierwszy wygląd), jak i %in%(zwraca wartość logiczną).

v <- c('a','b','c','e')

'b' %in% v
## returns TRUE

match('b',v)
## returns the first location of 'b', in this case: 2
medriscoll
źródło
co z uzyskaniem wszystkich pozorów, nie tylko pierwszego?
StatsSressress
Może spóźnię się trochę. which(v, 'b'). Zwróć uwagę na kolejność argumentów.
Niklas Mertsch,
Twój which(v, 'b')wyskakuje mi komunikat o błędzie:> Błąd w którym (v, „b”): argument „która” nie jest logiczne
Capt.Krusty
176

is.element() sprawia, że ​​kod jest bardziej czytelny i jest identyczny z %in%

v <- c('a','b','c','e')

is.element('b', v)
'b' %in% v
## both return TRUE

is.element('f', v)
'f' %in% v
## both return FALSE

subv <- c('a', 'f')
subv %in% v
## returns a vector TRUE FALSE
is.element(subv, v)
## returns a vector TRUE FALSE
Justin Nafe
źródło
6
Wiem, że dokumentacja mówi is.element(x, y) is identical to x %in% y. Ale nie wiem dlaczego, is.elementsdziała podczas mieszania liczb całkowitych i liczbowych i %in%nie robi
pomber
@pomber: Czy możesz podać przykład tego?
discipulus
@pomber jest naprawiony?
vasili111
2
Doskonała czytelność is.element()vs %in%jest subiektywna. Można stwierdzić, że operator poprawki jest bardziej czytelny, ponieważ eliminuje niejednoznaczność w kolejności argumentów. apple in fruitma sens, fruit in applenie ma. is.element(apple, fruit)lub is.element(fruit, apple)oba mogą mieć rację w zależności od implementacji is.elementfunkcji.
rileymcdowell
70

Zgrupuję opcje na podstawie danych wyjściowych. Załóżmy następujący wektor dla wszystkich przykładów.

v <- c('z', 'a','b','a','e')

Aby sprawdzić obecność:

%w%

> 'a' %in% v
[1] TRUE

każdy()

> any('a'==v)
[1] TRUE

is.element ()

> is.element('a', v)
[1] TRUE

Aby znaleźć pierwsze wystąpienie:

mecz()

> match('a', v)
[1] 2

Aby znaleźć wszystkie wystąpienia jako wektor wskaźników:

który()

> which('a' == v)
[1] 2 4

Aby znaleźć wszystkie wystąpienia jako wektor logiczny :

==

> 'a' == v
[1] FALSE  TRUE FALSE  TRUE FALSE

Edycja: Usunięcie grep () i grepl () z listy z powodów wymienionych w komentarzach

ishandutta2007
źródło
6
Jak już skomentowano tutaj i tutaj , nie używaj grep()ani wyrażeń regularnych, aby znaleźć dokładne dopasowania.
Uwe
69

Funkcja any () zapewnia czytelny kod

> w <- c(1,2,3)
> any(w==1)
[1] TRUE

> v <- c('a','b','c')
> any(v=='b')
[1] TRUE

> any(v=='f')
[1] FALSE
Dan Goldstein
źródło
9
Pamiętaj, że zachowuje się inaczej niż %in%: any(1==NA)zwraca NA, gdzie 1 %in% NAzwraca FALSE.
@ user3603486: any(1==NA, na.rm=TRUE)zwraca FALSE.
AkselA
36

Możesz użyć %in%operatora:

vec <- c(1, 2, 3, 4, 5)
1 %in% vec # true
10 %in% vec # false
ars
źródło
19

Również, aby znaleźć pozycję elementu „który” można wykorzystać jako

pop <- c(3,4,5,7,13)

which(pop==13)

i aby znaleźć elementy, które nie są zawarte w wektorze docelowym, można to zrobić:

pop <- c(1,2,4,6,10)

Tset <- c(2,10,7)   # Target set

pop[which(!(pop%in%Tset))]
Armin
źródło
whichjest czasem preferowane, ponieważ daje ci wszystkie pasujące pozycje (jako tablicę), w przeciwieństwie do match. Chociaż być może nie o to poprosił OP, w przeciwieństwie do stackoverflow.com/questions/1169388/...
Fizz
2
Po co męczyć się, whichjeśli chcesz znaleźć elementy, których nie ma Tset? Możesz po prostu indeksować popbezpośrednio; pop[!pop%in%Tset]
Houshalter,
13

W tym celu naprawdę lubię grep () i grepl ().

grep () zwraca wektor liczb całkowitych, które wskazują, gdzie są dopasowania.

yo <- c("a", "a", "b", "b", "c", "c")

grep("b", yo)
[1] 3 4

grepl () zwraca logiczny wektor z „PRAWDA” w miejscu dopasowania.

yo <- c("a", "a", "b", "b", "c", "c")

grepl("b", yo)
[1] FALSE FALSE  TRUE  TRUE FALSE FALSE

W funkcjach tych rozróżniana jest wielkość liter.

ojdajuiceman
źródło
10
Domyślnie grepjako pierwszy element przyjmuje wyrażenie regularne, więc aby dokładnie dopasować "b", użyj ^e$lub dodaj , fixed=TRUE).
reinierpost
10
Nie używaj wyrażenia regularnego dla dokładnych dopasowań. Jest to niebezpieczne i może mieć nieoczekiwane wyniki
David Arenburg,
9
Tak, to okropny, niezbyt dobry, bardzo zły pomysł - nieefektywny i gwarantujący złamanie. Np. myvar <- 'blah'; grepl('b', myvar, fixed=TRUE)Powróci, TRUEmimo że „b” nie jest w myvar.