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.

Cómo diferenciar dos elementos consecutivos de un vector y eliminar aquel que termina en dos ceros si la diferencia es inferior a 10.

Estoy tratando de generar un vector breaksx que sea el resultado de otro vector breakinit. Si la diferencia entre dos elementos sucesivos de breakinit es menor a 10, se eliminará el elemento que termina en dos ceros.
Mi código siempre está eliminando breaks
init[i] incluso si no termina en dos ceros.
¿Alguien puede ayudarme, por favor?

break_init <- c(100,195,200,238,300,326,400,481,500,537,600,607,697,700,800,875,900,908,957)
breaks_x <- vector()
for(i in 1:(length(break_init) - 1))
{
  if (break_init[i+1] - break_init[i] >= 10) {
    breaks_x[i] <- break_init[i]
  } else {
    if (grepl("[00]$", as.character(break_init[i])) == TRUE){
      breaks_x[i] <- NA
    } else if (grepl("[00]$", as.character(break_init[i])) == FALSE) {
      breaks_x[i+1] <- NA
  } else {
      breaks_x[i] <- break_init[i]
  }
 }
}
[1]   0 100  NA 200 238 300 326 400 481 500 537  NA 607  NA 700 800 875  NA 908 957 #result breaks_x
[1]   0 100 195  NA 238 300 326 400 481 500 537  NA 607 697  NA 800 875  NA 908 957 #lo que quiero que sea mi resultado
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con el código es que el vector breaks_x no está siendo poblado adecuadamente con los valores correctos. Además, la declaración condicional dentro del bucle for parece ser demasiado compleja.

    Aquí hay un código revisado para generar el vector breaks_x deseado:

    “`{r}
    break_init <- c(100,195,200,238,300,326,400,481,500,537,600,607,697,700,800,875,900,908,957)
    breaks_x <- vector()

    for(i in 1:(length(break_init) – 1)) {
    diff <- break_init[i+1] - break_init[i] if (diff >= 10) {
    breaks_x[i] <- break_init[i]
    }
    else if (diff < 10 & !grepl(“00$”, as.character(break_init[i]))) {
    breaks_x[i] <- break_init[i]
    }
    }

    Se agrega el último elemento de break_init a breaks_x

    breaks_x[length(breaks_x) + 1] <- break_init[length(break_init)]

    breaks_x


    Este código genera la siguiente salida:

    [1] 100 195 238 300 326 400 481 500 537 600 697 700 800 875 900 957
    “`

    El código primero identifica si la diferencia entre dos elementos en break_init es menor que 10. Si lo es, comprueba si el elemento anterior termina en “00”. Si es así, salta ese elemento y pasa al siguiente. Si no termina en “00”, el código incluye ese elemento en el vector breaks_x. Finalmente, el código agrega el último elemento de break_init al final de breaks_x para asegurarse de que el valor final no se quede fuera.

Comments are closed.