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 -- Juan Antonio Gil Pascual Profesor de Metodología de la Investigación Cuantitativa correo: jgil en edu.uned.es web: www.uned.es/personal/jgil Dpto. MIDE Facultad de Educación c/Juan del Rosal, 14 desp. 2.72 28040 Madrid Tel?f. 91 3987279 Fax. 91 3987288
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> -----Mensaje original----- > De: r-help-es-bounces en r-project.org [mailto:r-help-es-bounces en r- > project.org] En nombre de juan(uned) > Enviado el: jueves, 10 de julio de 2014 8:59 > Para: r-help-es en r-project.org > Asunto: [R-es] bucle > > 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 > > -- > Juan Antonio Gil Pascual > Profesor de Metodología de la Investigación Cuantitativa > correo: jgil en edu.uned.es > web: www.uned.es/personal/jgil > > Dpto. MIDE > Facultad de Educación > c/Juan del Rosal, 14 desp. 2.72 > 28040 Madrid > Tel‚f. 91 3987279 > Fax. 91 3987288 > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es
Hola, Juan: Eso sólo es posible si exactamente para uno de los valores de i no se cumple ninguna de las condiciones, con lo cual no llegas a incorporar valor en cinr. Puedes utilizar if else de modo que te emita un mensaje informando del "i" que no supera ninguno de los if. Un saludo. Eva El Jueves 10 de julio de 2014 8:58, juan(uned) <jgil@edu.uned.es> escribió: 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 -- Juan Antonio Gil Pascual Profesor de Metodología de la Investigación Cuantitativa correo: jgil@edu.uned.es web: www.uned.es/personal/jgil Dpto. MIDE Facultad de Educación c/Juan del Rosal, 14 desp. 2.72 28040 Madrid Tel‚f. 91 3987279 Fax. 91 3987288 _______________________________________________ R-help-es mailing list R-help-es@r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es [[alternative HTML version deleted]]
Juan, Prueba a utilizar for (i in 0:(n-1)) A lo mejor sólo estás comprobando los (n-1) casos. Eva El Jueves 10 de julio de 2014 9:37, Eva Prieto Castro <evapcastro@yahoo.es> escribió: Hola, Juan: Eso sólo es posible si exactamente para uno de los valores de i no se cumple ninguna de las condiciones, con lo cual no llegas a incorporar valor en cinr. Puedes utilizar if else de modo que te emita un mensaje informando del "i" que no supera ninguno de los if. Un saludo. Eva El Jueves 10 de julio de 2014 8:58, juan(uned) <jgil@edu.uned.es> escribió: 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 -- Juan Antonio Gil Pascual Profesor de Metodología de la Investigación Cuantitativa correo: jgil@edu.uned.es web: www.uned.es/personal/jgil Dpto. MIDE Facultad de Educación c/Juan del Rosal, 14 desp. 2.72 28040 Madrid Tel‚f. 91 3987279 Fax. 91 3987288 _______________________________________________ R-help-es mailing list R-help-es@r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es [[alternative HTML version deleted]]
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> -----Mensaje original----- > De: r-help-es-bounces en r-project.org [mailto:r-help-es-bounces en r- > project.org] En nombre de juan(uned) > Enviado el: jueves, 10 de julio de 2014 8:59 > Para: r-help-es en r-project.org > Asunto: [R-es] bucle > > 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 > > -- > Juan Antonio Gil Pascual > Profesor de Metodología de la Investigación Cuantitativa > correo: jgil en edu.uned.es > web: www.uned.es/personal/jgil > > Dpto. MIDE > Facultad de Educación > c/Juan del Rosal, 14 desp. 2.72 > 28040 Madrid > Tel‚f. 91 3987279 > Fax. 91 3987288 > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es
Hola Juan Antonio, Has pensado considerar una aproximacion diferente? De ser asi, explora ?cut y ?car:::recode. Saludos, Jorge.- 2014-07-10 16:58 GMT+10:00 juan(uned) <jgil@edu.uned.es>:> 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 > > -- > Juan Antonio Gil Pascual > Profesor de Metodología de la Investigación Cuantitativa > correo: jgil@edu.uned.es > web: www.uned.es/personal/jgil > > Dpto. MIDE > Facultad de Educación > c/Juan del Rosal, 14 desp. 2.72 > 28040 Madrid > Tel'f. 91 3987279 > Fax. 91 3987288 > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es >[[alternative HTML version deleted]]
Eva muchas gracias por la contestación pero hay muchos casos que no cumplen la condición y cinr toma el valor NA porque inr toma valores fuera de los intervalos que pongo pero rango_inr1 siempre toma uno de los 11 valores, además sum(table(rango_inr1)) es 3738. Podías concretar la opción que comentas de ifelse(). Muchas gracias a Jorge y a Isidro. Probaré la alternativa de Isidro. Un cordial saludo, Juan El 10/07/2014 9:37, Eva Prieto Castro escribió:> Hola, Juan: > > Eso sólo es posible si exactamente para uno de los valores de i no se > cumple ninguna de las condiciones, con lo cual no llegas a incorporar > valor en cinr. > > Puedes utilizar if else de modo que te emita un mensaje informando del > "i" que no supera ninguno de los if. > > Un saludo. > Eva > > > El Jueves 10 de julio de 2014 8:58, juan(uned) <jgil@edu.uned.es> > escribió: > > > 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 > > -- > Juan Antonio Gil Pascual > Profesor de Metodología de la Investigación Cuantitativa > correo: jgil@edu.uned.es <mailto:jgil@edu.uned.es> > web: www.uned.es/personal/jgil > > Dpto. MIDE > Facultad de Educación > c/Juan del Rosal, 14 desp. 2.72 > 28040 Madrid > Tel‚f. 91 3987279 > Fax. 91 3987288 > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org <mailto:R-help-es@r-project.org> > https://stat.ethz.ch/mailman/listinfo/r-help-es >-- Juan Antonio Gil Pascual Profesor de Metodología de la Investigación Cuantitativa correo: jgil@edu.uned.es web: www.uned.es/personal/jgil Dpto. MIDE Facultad de Educación c/Juan del Rosal, 14 desp. 2.72 28040 Madrid Tel‚f. 91 3987279 Fax. 91 3987288 [[alternative HTML version deleted]]