2011-04-07 11 views
196

In R, ho un elemento x e un vettore v. Voglio trovare il primo indice di un elemento in v uguale a x. So che un modo per farlo è: which(x == v)[[1]], ma sembra eccessivamente inefficiente. C'è un modo più diretto per farlo?Esiste una funzione R per trovare l'indice di un elemento in un vettore?

Per i punti bonus, c'è una funzione che funziona se x è un vettore? Vale a dire, dovrebbe restituire un vettore di indici che indica la posizione di ciascun elemento di x in v.

+0

Poiché R è ottimizzato per lavorare con i vettori, 'which (x == v) [[1]]' non è molto inefficiente. È un operatore di confronto ('==') applicato a tutti gli elementi del vettore e un sottoinsieme sugli indici ('which'). Questo è tutto. Nulla che dovrebbe essere rilevante, purché non si eseguano 10.000 ripetizioni su questa funzione. Altre soluzioni come 'match' e' Position' potrebbero non restituire tanti dati quanti 'which', ma non sono necessariamente più efficienti. – BurninLeo

+1

La mia domanda specifica che preferirei una funzione che è stata vettorizzata su x e 'which (x == v) [[1]]' non lo è. –

risposta

279

La funzione match opere su vettori:

x <- sample(1:10) 
x 
# [1] 4 5 9 3 8 1 6 10 7 2 
match(c(4,8),x) 
# [1] 1 5 

match restituisce solo il primo incontro di una partita, come da voi richiesto. Restituisce la posizione nel secondo argomento dei valori nel primo argomento.

Per corrispondenza multipla, %in% è la strada da percorrere:

x <- sample(1:4,10,replace=TRUE) 
x 
# [1] 3 4 3 3 2 3 1 1 2 2 
which(x %in% c(2,4)) 
# [1] 2 5 9 10 

%in% restituisce un vettore logico finché il primo argomento, con un TRUE se tale valore può essere trovato nel secondo argomento e FALSE altrimenti.

+0

Penso che un esempio con c (2,3,3) ec (1,2,3,4) con entrambe le corrispondenze e% in% sarebbe più istruttivo con meno modifiche tra gli esempi. match (c (2,3,3), c (1: 4)) restituisce risultati diversi dai quali (c (2,3,3)% in% c (1: 4)) senza richiedere un primo vettore più lungo e come molti cambiamenti da esempio ad esempio. Vale anche la pena notare che gestiscono le non-partite in modo molto diverso. – John

+1

@John: è tutto vero, ma non è quello che ha chiesto l'OP. L'OP ha chiesto, partendo da un lungo vettore, di trovare la prima corrispondenza di elementi dati in un altro. E per completezza, ho aggiunto che se sei interessato a tutti gli indici, dovrai usare quale (% in%). A proposito, non c'è motivo di cancellare la tua risposta. È un'informazione valida. –

+0

È un'informazione valida ma non c'è più ...:) – John

19

la funzione Position in funprog {base} fa anche il lavoro. Ti permette di passare una funzione arbitraria e restituisce la prima o l'ultima partita.

Position(f, x, right = FALSE, nomatch = NA_integer)

3

R ha sovraccaricato i doppio uguale == operatore con un metodo per trovare l'indice di un ago in un pagliaio vettore. Produce un vettore logical, contenente i valori TRUE per ogni corrispondenza nel pagliaio.

Esempio:

haystack <- c(1, 2, 4, 3, 4) 
needle <- 4 
indices <- needle == haystack 
indices 
[1] 3 5 
haystack[indices] 
[1] 4 4 

Funziona se entrambi sono vettori, e può essere ampliato per utilizzare più vettori pure.

+1

L'operatore '==' era già menzionato nella mia domanda come una soluzione inefficiente che non funziona con un vettore di aghi. –

+0

"funziona se entrambi sono vettori" - forse, a seconda di cosa intendi ... ma non nel senso che l'OP voleva. – Frank

+10

Ottiene 'FALSE FALSE TRUE FALSE TRUE' anziché gli indici in questo esempio –

Problemi correlati