Come verificare se un vettore contiene un determinato valore?
%segni- fianchi che è. La parola inè una parola riservata in uso R nella costruzione for-loop.
select(iris, contains("etal")).
Come verificare se un vettore contiene un determinato valore?
%segni- fianchi che è. La parola inè una parola riservata in uso R nella costruzione for-loop.
select(iris, contains("etal")).
Risposte:
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
which(v, 'b'). Fai attenzione all'ordine degli argomenti.
which(v, 'b')mi dà un messaggio di errore:> Errore in cui (v, 'b'): argomento 'che' non è logico
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
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
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.
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
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
%in%: any(1==NA)restituisce NA, dove 1 %in% NArestituisce FALSE.
any(1==NA, na.rm=TRUE)ritorna FALSE.
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/…
whichse vuoi solo trovare gli elementi non presenti Tset? Puoi semplicemente indicizzare popdirettamente; pop[!pop%in%Tset]
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.
grepprende un'espressione regolare come primo elemento, quindi per fare una corrispondenza esatta "b", utilizzare ^e$o aggiungere , fixed=TRUE).