es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Resultado inesperado al comparar cadenas con `==`

Tengo dos vectores:

a = strsplit("po","")[[1]]
[1] "p" "o"

b = strsplit("polo","")[[1]]
[1] "p" "o" "l" "o"
<code>
Estoy intentando compararlos usando `==`.
Desafortunadamente, `a==b` devuelve un resultado inesperado.
</code>r
a==b
[1]  TRUE  TRUE FALSE  TRUE
<code>
Mientras espero tener:
</code>r
[1]  TRUE  TRUE FALSE  FALSE

Entonces, ¿qué está causando esto y cómo se puede lograr el resultado esperado?

El problema parece estar relacionado con el hecho de que el último elemento de ambos vectores es el mismo. Cambiar b por ejemplo a polf sí da el resultado esperado, y también porque al establecer b como pooo da TRUE TRUE FALSE TRUE y no TRUE TRUE TRUE TRUE.

Editar

En otras palabras, esperaría que los elementos faltantes (cuando las longitudes difieren) se pasen como nada (solo "" parece dar TRUE TRUE FALSE FALSE, NA y NULL dan resultados diferentes).
r
c("p","o","","")==c("p","o","l","o")
[1] TRUE TRUE FALSE FALSE

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema es que el operador == compara elemento por elemento y recicla el vector más corto. Esto significa que el tercer elemento de a se compara con el tercer elemento de b, y dado que el tercer elemento de b es l y el tercer elemento de a es una cadena vacía, el resultado es FALSE, y lo mismo ocurre con el cuarto elemento. Sin embargo, la reciclación entra en juego y compara la cadena vacía en a con el último elemento en b, que también es un o, resultando en TRUE.

    Para obtener el resultado esperado, podemos agregar cadenas vacías al vector más corto, o podemos probar la igualdad de los vectores ordenados de la siguiente manera:

    # agregar cadenas vacías al vector más corto
    max_len <- max(length(a), length(b))
    a_padded <- c(a, rep("", max_len - length(a)))
    b_padded <- c(b, rep("", max_len - length(b)))
    
    a_padded == b_padded
    # [1]  TRUE  TRUE FALSE FALSE
    
    # ordenar los vectores antes de compararlos
    sort(a) == sort(b)
    # [1]  TRUE  TRUE FALSE FALSE
    

    Ambos métodos resultan en la salida esperada, donde los tercer y cuarto elementos son FALSE.

Comments are closed.