Verifica se un vettore contiene un determinato elemento


518

Come verificare se un vettore contiene un determinato valore?


38
a volte mi chiedo perché R semplicemente non usa la parola contiene per facilitare gli utenti
greg121

12
considerare che "in" è contenuto in "conta (in) s"; Direi che "in" è un contendente considerevolmente conciso in questo contesto
hedgedandlevered

1
Forse con l'aggiunta di %segni- fianchi che è. La parola inè una parola riservata in uso R nella costruzione for-loop.
IRTFM,

@ greg121 dplyr ha già una funzione contiene , ma è utilizzata per uno scopo diverso: selezionare una colonna in un frame di dati. Per esempio select(iris, contains("etal")).
Paul Rougieux,

Esiste un modo conciso per farlo con numeri reali valutati con una data precisione?
mlt

Risposte:


500

Le funzioni match()(restituisce la prima apparizione) e %in%(restituisce un valore booleano) sono progettate per questo.

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

'b' %in% v
## returns TRUE

match('b',v)
## returns the first location of 'b', in this case: 2

che ne dici di ottenere tutte le apparenze, non solo la prima?
StatsSorceress

Forse arrivo un po 'tardi. which(v, 'b'). Fai attenzione all'ordine degli argomenti.
Niklas Mertsch,

Il tuo which(v, 'b')mi dà un messaggio di errore:> Errore in cui (v, 'b'): argomento 'che' non è logico
Capt.Krusty

176

is.element() rende il codice più leggibile ed è identico a %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

6
So che la documentazione dice is.element(x, y) is identical to x %in% y. Ma non so perché, is.elementsfunziona quando si mescolano numeri interi e numerici e %in%non lo fa
pomber,

@pomber: potresti fare un esempio di questo?
discipulus,

@pomber è riparato?
vasili111,

2
La leggibilità superiore is.element()vs %in%è soggettiva. È possibile ipotizzare che un operatore infix sia più leggibile perché elimina le ambiguità nell'ordine degli argomenti. apple in fruitha senso, fruit in appleno. is.element(apple, fruit)o is.element(fruit, apple)potrebbe essere giusto a seconda dell'implementazione della is.elementfunzione.
rileymcdowell,

70

Raggrupperò le opzioni in base all'output. Assumi il seguente vettore per tutti gli esempi.

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

Per verificare la presenza:

%in%

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

qualunque()

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

is.element ()

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

Per trovare la prima occasione:

incontro()

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

Per trovare tutte le occorrenze come vettore di indici:

quale()

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

Per trovare tutte le occorrenze come vettore logico :

==

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

Modifica: rimozione di grep () e grepl () dall'elenco per il motivo menzionato nei commenti


6
Come già commentato qui e qui , non usare grep()né espressioni regolari per trovare corrispondenze esatte.
Uwe,

69

La funzione any () rende il codice leggibile

> 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

9
Ricorda che questo si comporta in modo diverso da %in%: any(1==NA)restituisce NA, dove 1 %in% NArestituisce FALSE.

@ user3603486: any(1==NA, na.rm=TRUE)ritorna FALSE.
AkselA

36

Puoi usare l' %in%operatore:

vec <- c(1, 2, 3, 4, 5)
1 %in% vec # true
10 %in% vec # false

19

Anche per trovare la posizione dell'elemento "che" può essere usato come

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

which(pop==13)

e per trovare gli elementi che non sono contenuti nel vettore target, si può fare questo:

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

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

pop[which(!(pop%in%Tset))]

whichè effettivamente preferibile a volte perché ti dà tutte le posizioni corrispondenti (come un array), a differenza match. Anche se questo non era forse ciò che l'OP aveva richiesto, a differenza di stackoverflow.com/questions/1169388/…
Fizz

2
Perché preoccuparsi whichse vuoi solo trovare gli elementi non presenti Tset? Puoi semplicemente indicizzare popdirettamente; pop[!pop%in%Tset]
Houshalter,

13

Mi piace molto grep () e grepl () per questo scopo.

grep () restituisce un vettore di numeri interi, che indicano dove si trovano le corrispondenze.

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

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

grepl () restituisce un vettore logico, con "TRUE" nella posizione delle corrispondenze.

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

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

Queste funzioni fanno distinzione tra maiuscole e minuscole.


10
Per impostazione predefinita, grepprende un'espressione regolare come primo elemento, quindi per fare una corrispondenza esatta "b", utilizzare ^e$o aggiungere , fixed=TRUE).
reinierpost

10
Non usare regex per corrispondenze esatte. Questo è pericoloso e può avere risultati inaspettati
David Arenburg,

9
Sì, questa è un'idea terribile, non buona, molto cattiva - inefficiente e garantita per rompersi. Ad esempio myvar <- 'blah'; grepl('b', myvar, fixed=TRUE), tornerà TRUEanche se 'b' non è presente myvar.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.