Skip to content

[R-es] bucle

8 messages · Juan Antonio Gil Pascual, Isidro Hidalgo, Eva Prieto Castro +2 more

#
Estimados compañeros, hoy me ha surgido una duda, quizás trivial, pero 
que no encuentro sentido. Tengo un bucle con el siguiente código:

for (i in 1:n)
{
if (rango_inr1[i]==1 & (inr[i]>= 2 & inr[i]<= 3)) cinr[i]<-1
if (rango_inr1[i]==2 & (inr[i]>= 2.5 & inr[i]<= 3.5)) cinr[i]<-2
if (rango_inr1[i]==3 & (inr[i]>= 2 & inr[i]<= 2.9)) cinr[i]<-3
if (rango_inr1[i]==4 & (inr[i]>= 2.25 & inr[i]<= 3.5)) cinr[i]<-4
if (rango_inr1[i]==5 & (inr[i]>= 2.2 & inr[i]<= 3.25)) cinr[i]<-5
if (rango_inr1[i]==6 & (inr[i]>= 2 & inr[i]<= 3.5)) cinr[i]<-6
if (rango_inr1[i]==7 & (inr[i]>= 2 & inr[i]<= 4)) cinr[i]<-7
if (rango_inr1[i]==8 & (inr[i]>= 2 & inr[i]<= 2.6)) cinr[i]<-8
if (rango_inr1[i]==9 & (inr[i]>= 2 & inr[i]<= 2.5)) cinr[i]<-9
if (rango_inr1[i]==10 & (inr[i]>= 2 & inr[i]<=2.8)) cinr[i]<-10
if (rango_inr1[i]==11 & (inr[i]>= 2.5 & inr[i]<= 4)) cinr[i]<-11
}

donde n vale 3738 e i naturalmente 3738. Pues bien, resulta que la 
variable creada cinr tiene 3737 casos. ¿Qué puede estar ocurriendo?. He 
comprobado los casos de rango_inr1 y de inr y son 3738.
¿Qué estoy haciendo mal?.

Un cordial saludo,

Juan
#
Probablemente tienes un caso en el que ninguna de las 11 condiciones se
cumple... Fíjate con los datos simulados, hay 1686 casos fuera de las
condiciones que defines:

set.seed(12345)
rango_inr1 = ceiling(runif(3738,0,11))
inr = runif(3738,2,4)
n=3738
cinr = rep(NA, 3738)
for (i in 1:n)
{
     if (rango_inr1[i]==1 & (inr[i]>= 2 & inr[i]<= 3))
          cinr[i]<-1
     if (rango_inr1[i]==2 & (inr[i]>= 2.5 & inr[i]<= 3.5))
          cinr[i]<-2
     if (rango_inr1[i]==3 & (inr[i]>= 2 & inr[i]<= 2.9))
          cinr[i]<-3
     if (rango_inr1[i]==4 & (inr[i]>= 2.25 & inr[i]<= 3.5))
          cinr[i]<-4
     if (rango_inr1[i]==5 & (inr[i]>= 2.2 & inr[i]<= 3.25))
          cinr[i]<-5
     if (rango_inr1[i]==6 & (inr[i]>= 2 & inr[i]<= 3.5))
          cinr[i]<-6
     if (rango_inr1[i]==7 & (inr[i]>= 2 & inr[i]<= 4))
          cinr[i]<-7
     if (rango_inr1[i]==8 & (inr[i]>= 2 & inr[i]<= 2.6))
          cinr[i]<-8
     if (rango_inr1[i]==9 & (inr[i]>= 2 & inr[i]<= 2.5))
          cinr[i]<-9
     if (rango_inr1[i]==10 & (inr[i]>= 2 & inr[i]<=2.8))
          cinr[i]<-10
     if (rango_inr1[i]==11 & (inr[i]>= 2.5 & inr[i]<= 4))
          cinr[i]<-11
}
table(cinr)
sum(is.na(cinr))

Un saludo.

Isidro Hidalgo Arellano
Observatorio Regional de Empleo
Consejería de Empleo y Economía
http://www.jccm.es
#
De todas formas, es mejor (y más rápido) no usar un bucle y asignar
directamente:

cinr = rep(NA, 3738)
cinr[rango_inr1==1 & (inr>= 2 & inr<= 3)] <- 1
cinr[rango_inr1==2 & (inr>= 2.5 & inr<= 3.5)] <- 2
cinr[rango_inr1==3 & (inr>= 2 & inr<= 2.9)] <- 3
cinr[rango_inr1==4 & (inr>= 2.25 & inr<= 3.5)] <- 4
cinr[rango_inr1==5 & (inr>= 2.2 & inr<= 3.25)] <- 5
cinr[rango_inr1==6 & (inr>= 2 & inr<= 3.5)] <- 6
cinr[rango_inr1==7 & (inr>= 2 & inr<= 4)] <- 7
cinr[rango_inr1==8 & (inr>= 2 & inr<= 2.6)] <- 8
cinr[rango_inr1==9 & (inr>= 2 & inr<= 2.5)] <- 9
cinr[rango_inr1==10 & (inr>= 2 & inr<= 2.8)] <- 10
cinr[rango_inr1==11 & (inr>= 2.5 & inr<= 4)] <- 11)

Un saludo.

Isidro Hidalgo Arellano
Observatorio Regional de Empleo
Consejería de Empleo y Economía
http://www.jccm.es