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.