2009-07-23 9 views
363

In R, come si verifica un vettore per vedere se contiene un dato elemento?test se un vettore contiene un dato elemento

+28

a volte mi chiedo il motivo per cui R semplicemente non usa la parola contiene per rendere più facile agli utenti – greg121

+8

ritiene 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 che fiancheggiano. La parola "in" è una parola riservata in R usata nella costruzione for-loop. –

risposta

373

Entrambe le funzioni match() (restituisce la prima apparizione) e %in% (restituisce un 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 
31

È possibile utilizzare il %in% dell'operatore:

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

La qualsiasi funzione() fa per 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 
+4

Si noti che questo comportamento si comporta in modo diverso da '% in%': 'any (1 == NA)' restituisce 'NA', dove' 1% in% NA' restituisce 'FALSE'. – dash2

15

anche a trovare la posizione dell'elemento "che" può essere utilizzato come

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

which(pop==13) 

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

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

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

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

'which' in realtà è preferibile a volte perché ti dà * tutto * le posizioni corrispondenti (come una matrice), a differenza di' match'. Anche se questo forse non era quello che l'OP chiedeva, a differenza di http://stackoverflow.com/questions/1169388/finding-multiple-elements-in-a-vector – Fizz

+0

Perché preoccuparsi di 'which' se vuoi solo trovare gli elementi non in 'Tset'? Puoi semplicemente indicizzare 'pop' direttamente; 'pop [! pop% in% Tset]' – Houshalter

136

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

So che la documentazione dice 'is.element (x, y) è identico a x% in% y'. Ma, non so perché, 'is.elements' funziona quando si mescolano numeri interi e numeri e'% in% 'non è – pomber

+0

@pomber: Puoi dare un esempio di questo? – discipulus

8

davvero come 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.

+8

Per impostazione predefinita, 'grep' prende un'espressione regolare come primo elemento, quindi per eseguire una corrispondenza esatta per' "b" ', usa '^ e $' o aggiungi ', fixed = TRUE'). – reinierpost

+8

Non utilizzare espressioni regolari per le corrispondenze esatte. Questo è pericoloso e può avere risultati imprevisti –

+8

Sì, questa è un'idea terribile, non buona, pessima - inefficiente e garantita da rompere. Per esempio. 'myvar <- 'blah'; grepl ('b', myvar, fixed = TRUE) 'restituirà' TRUE' anche se 'b' non è in 'myvar'. – dash2

15

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

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

Per verifica di presenza:

% in%

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

qualsiasi()

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

è.Elemento()

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

per reperire prima occorrenza:

partita()

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

Per trovare tutte le occorrenze come vettore di indici:

che()

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

Per trovare tutte le occorrenze come logica vettore:

==

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

Edit: Rimozione grep() e Grepl() dalla lista per il motivo citato nei commenti

+5

Come già commentato [qui] (https://stackoverflow.com/questions/1169248/r-function-for-testing-if-a-vector-contains-a-given-element/34056066#comment66181358_34056066) e [qui] (https://stackoverflow.com/questions/1169248/r-function-for-testing-if-a-vector-contains-a-given-element/34056066#comment73025314_34056066), non utilizzare 'grep()' o espressioni regolari per trovare corrispondenze esatte. – Uwe