2011-12-01 3 views
6

Supponiamo di avere un vettore x<-c(1,2,NA,4,5,NA).Differenze tra vettori _including_ NA

applico un certo codice mitologico a quel vettore, che si traduce in un altro vettore, y<-c(1,NA,3, 4,10,NA)

Ora desidero scoprire in cui posiziona miei due vettori diversi, dove io reputo due NA s come la stessa e uno NA e un numero non NA (ad esempio il secondo elemento dei due vettori di esempio).

In particolare, per il mio esempio, vorrei finire con un vettore che contiene c(2,3,5).

Per il mio caso d'uso, non mi accontento di un vettore di variabili logiche, ma ovviamente posso facilmente convertire (which), quindi accetterò anche quello.

mi hanno alcune soluzioni come:

simplediff<-x!=y 
nadiff<-is.na(x)!=is.na(y) 
which(simplediff | nadiff) 

Ma ci si sente come sto reinventare la ruota qui. Qualche opzione migliore?

+3

sembra perfettamente ragionevole per me. –

+0

Cos'è il codice mitologico? – James

+0

@James: è come quel vecchio cartone animato con un mucchio di orribili equazioni in cima alla lavagna, poi la frase "il prossimo miracolo si verifica", seguita dall'equazione finale desiderata. –

risposta

0

Una soluzione posible (ma sicuro che non è il migliore):

(1:length(x))[-which((x-y)==0)] 
+0

Questo ha alcuni vantaggi (non funziona per i vettori di caratteri, ad esempio), ma a parte questo: se sia il vettore originale che quello nuovo mantengono 'NA' in qualche punto, questo contrassegnerà questo punto come diverso (ho modificato la mia domanda originale per includerla nell'esempio). Comunque, grazie per lo sforzo. –

6

Che ne dite di looping e l'utilizzo identical?

!mapply(identical,x,y) 
[1] FALSE TRUE TRUE FALSE TRUE FALSE 

E per le posizioni:

seq_along(x)[!mapply(identical,x,y)] 
[1] 2 3 5 

o

which(!mapply(identical,x,y)) 
[1] 2 3 5 
+0

Qualche logica dietro al voto negativo? – James

+0

Interessante ma presumibilmente eccessivo, dal momento che controllerà le differenze nei nomi e altri attributi. (Downvote non ero io!) –

+0

@RichieCotton Buon punto, pensavo che le opzioni potessero perfezionare quel comportamento, ma sembra che lo renda solo più severo. – James