Foro de debate

Comparación de elementos entre vectores

Comparación de elementos entre vectores

de Rafael Molina Venegas -
Número de respuestas: 2
Buenos días, propongo el siguiente problema que se me plantea:

Tengo dos vectores de diferente longitud de modo factor

Por ejemplo (he escrito a lo largo del mensaje "-" en lugar de el símbolo convencional para crear objetos de R, ya que por algún motivo el editor de texto del foro reconoce este símbolo como final de mensaje)

lista - c(arbol, maceta, coche, guitarra)
sierra - c(maceta, guitarra)

Lo que deseo es comparar cada elemento del vector "lista" con cada uno de los elementos del vector "sierra". Si el elemento del vector "lista" comparado coincide con alguno de los elementos del vector sierra, entonces quiero que el valor devuelto sea 1, y de lo contrario, 0. Así, según los dos vectores que pongo como ejemplo, el resultado debería ser un vector tal que así:

TA - 0,1,0,1

Para ello he creado el siguiente script, que no funciona.


TA - vector(length = 4)
for(i in 1:4){
if (lista[i]==sierra[]) TA[i]-1
else TA[i] -0
}

Se que el problema está en "==sierra[]". Lo que quiero decir con esta expresión es "si lista [i] es igual a alguno de los elementos de sierra, entonces 1, y de lo contrario 0.

¿podrían ayudarme?


Gracias!

Rafa
En respuesta a Rafael Molina Venegas

Re: Comparación de elementos entre vectores

de Manuel Muñoz Márquez -
Hola Rafa:

En primer lugar decirte que puedes utilizar también el símbolo = para las asignaciones.

Desconozco cuál es el motivo de hacer lo que propones pero si es para filtrar existe otra solución más sencilla:

sierra = c('maceta', 'guitarra')
lista = c('arbol', 'maceta', 'coche', 'guitarra')
l = factor(lista, levels=sierra)
l
[1] <NA> maceta <NA> guitarra
Levels: maceta guitarra


De todas formas tienes que tener cuidado, ni sierra ni lista son un factor, son vectores. Si utilizas factores la cosa cambiaría un poco:

sierra = c('maceta', 'guitarra')
lista = c('arbol', 'maceta', 'coche', 'guitarra')
l = factor(lista, levels=levels(sierra))
l
[1] <NA> maceta <NA> guitarra
Levels: maceta guitarra

Si te vale con verdadero falso puedes hacer:
is.na(l)
[1] TRUE FALSE TRUE FALSE

Y si necesitas obligatoriamente los números pues:
as.numeric(is.na(l))
[1] 1 0 1 0

Saludos.
En respuesta a Manuel Muñoz Márquez

Re: Comparación de elementos entre vectores

de Manuel Muñoz Márquez -
Hola Rafa:

Me has comentado en un mensaje privado una solución basada en un bucle. Al ser R un lenguaje interpretado, los bucles van mucho más lentos que cuando se usan las instrucciones nativas de R. Además con un poquito de habilidad se pueden evitar los bucles la mayoría de las veces.

Basándome en tu solución, he construido otra sin bucles:
sierra = c('maceta', 'guitarra')
lista = c('arbol', 'maceta', 'coche', 'guitarra')
lista %in% sierra
[1] FALSE TRUE FALSE TRUE
> as.numeric(lista %in% sierra)
[1] 0 1 0 1

Saludos.