2011-12-01 17 views
6

Supongamos que tengo un vector x<-c(1,2,NA,4,5,NA).Diferencias entre vectores _including_ NA

aplico algo de código mitológica a ese vector, lo que resulta en otro vector, y<-c(1,NA,3, 4,10,NA)

Ahora desea conocer en qué posiciones mis dos vectores diferentes, donde cuento dos NA s como siendo el mismo , y uno NA y un no NA (por ejemplo, el segundo elemento de los dos vectores de ejemplo).

Específicamente, para mi ejemplo, me gustaría terminar con un vector que contenga c(2,3,5).

Para mi caso de uso, no estoy contento con un vector de variables lógicas, pero obviamente puedo convertir fácilmente (which), así que lo aceptaré también.

tengo algunas soluciones como:

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

pero se siente como si estuviera reinventar la rueda. ¿Alguna mejor opción?

+3

parece perfectamente razonable para mí. –

+0

¿Qué es el código mitológico? – James

+0

@James: es como esa vieja caricatura con un montón de ecuaciones horribles en la parte superior de la pizarra, luego la declaración "luego ocurre un milagro", seguido por la ecuación final deseada. –

Respuesta

0

Una posible solución (pero seguro que no es el mejor):

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

Esto tiene algunas ventajas (no funciona para vectores de caracteres, por ejemplo), pero aparte de eso: si tanto el vector original como el nuevo contienen 'NA 'en algún punto, esto marcará este punto como diferente (lo he edité mi pregunta original para incluir esto en el ejemplo). Aún así, gracias por el esfuerzo. –

6

¿Qué hay de bucle y el uso de identical?

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

Y para posiciones:

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

o

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

¿Algún razonamiento detrás del voto hacia abajo? – James

+0

Interesante, pero presumiblemente exagerado, ya que verificará las diferencias en los nombres y otros atributos. (¡Abajo no fui yo!) –

+0

@RichieCotton Buen punto, pensó que las opciones podían afinar ese comportamiento, pero parece que solo lo hace más estricto. – James