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.elements
funziona 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 fruit
ha senso, fruit in apple
no. is.element(apple, fruit)
o is.element(fruit, apple)
potrebbe essere giusto a seconda dell'implementazione della is.element
funzione.
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% NA
restituisce 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/…
which
se vuoi solo trovare gli elementi non presenti Tset
? Puoi semplicemente indicizzare pop
direttamente; 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.
grep
prende un'espressione regolare come primo elemento, quindi per fare una corrispondenza esatta "b"
, utilizzare ^e$
o aggiungere , fixed=TRUE
).