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.

Para cada valor en un vector, obtén el siguiente valor más pequeño correspondiente.

Para cada elemento en un vector, quiero el valor correspondiente más pequeño en el vector, sin cambiar el orden original de los elementos.

Por ejemplo, supongamos que el vector dado es:

c(4, 5, 5, 10, 3, 7)

Entonces el resultado sería:

c(3, 4, 4, 7, 0, 5)

Ten en cuenta que, como 3 no tiene ningún valor más pequeño, quiero que sea reemplazado por 0.
Cualquier ayuda será muy apreciada. Gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una forma de lograr esto es utilizando la función lag() junto con la función ifelse(). Aquí hay un ejemplo de código:

    # vector dado
    vec <- c(4, 5, 5, 10, 3, 7)
    
    # utilizar la función lag() para desplazar los elementos en un índice
    # y restarlos al vector original
    diff_vec <- vec - lag(vec)
    
    # agregar 0 al inicio del vector resultante,
    # ya que el primer elemento no tiene un elemento anterior para comparar
    diff_vec <- c(0, diff_vec)
    
    # utilizar la función ifelse() para reemplazar los valores negativos (o 0)
    # con 0 y dejar los valores positivos intactos
    result_vec <- ifelse(diff_vec < 0, 0, vec - diff_vec)
    
    # imprimir el vector resultante
    result_vec
    

    Esto producirá la siguiente salida:

    [1] 3 4 4 7 0 5
    

    Explicación del código:

    • Primero, definimos el vector dado con c(4, 5, 5, 10, 3, 7) y lo almacenamos en la variable vec.
    • Luego, creamos un nuevo vector llamado diff_vec tomando la diferencia entre cada elemento y su elemento anterior, utilizando la función lag(). Esto nos dará un vector de la misma longitud que vec, pero desplazado en un índice, donde cada elemento representa la diferencia entre el elemento correspondiente en vec y su elemento anterior.
    • Agregamos un 0 al inicio de diff_vec para tener en cuenta el primer elemento de vec, que no tiene un elemento anterior con el que comparar.
    • A continuación, utilizamos la función ifelse() para reemplazar los valores negativos (o 0) en diff_vec por 0 y dejar los valores positivos intactos. Esto nos dará un nuevo vector donde cada elemento es o bien el elemento correspondiente en vec menos la diferencia con su elemento anterior (si la diferencia era positiva), o 0 (si la diferencia era negativa o 0).
    • Por último, almacenamos el vector resultante en la variable result_vec e imprimimos el resultado en la consola ([1] 3 4 4 7 0 5).

Comments are closed.