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 breaksinit[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
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
[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.