* * * * Hola, tengo una duda. Estoy intentando reproducir algo que hago a diario en SAS en el trabajo. Data tabla2; set tabla1; if var1>5 then var2="+5"; else var2="-5"; run; Estoy intentando hacer este ejemplo con R porque me gustaría replicar todo lo que sé de SAS en R. Sé que el IF de R no es vectorial pero por lo que he visto en internet se puede arreglar con un bucle. La función IFELSE me gusta menos porque creo que para anidar 3 o más if es poco esquemática. Otra alternativa sería usar sqldf pero como os decía en internet he visto el tema de mezclar bucles con IF. Os pongo lo que he hecho y el error porque no encuentro el fallo. a<-c(1,2,3,12,13) b<-c("a","b","c","d","e") Mi script: data<-(c(a ,b)) dim(data)<-c(5,2) data<-data.frame(data) nrow(data) data$X3<-c("a","b","c","d","e") ## no sé si es necesario crear antes la columna pero por si las flies la creo for (i in 1:nrow(data)){if (data$X1[i]>5) {data$X3[i]<-"F"}} La consola de R:> for (i in 1:nrow(data)){if (data$X1[i]>5) {data$X3[i]<-"F"}}Error en if (data$X1[i] > 5) { : valor ausente donde TRUE/FALSE es necesario Además: Mensajes de aviso perdidos In Ops.factor(data$X1[i], 5) : > not meaningful for factors Muchas gracias y saludos Otto F. [[alternative HTML version deleted]]
Hola Otto, Creo que lo que necesitas es ifelse(): a <- c(1,2,3,12,13) b <- c("a","b","c","d","e") d <- data.frame(a, b) d$X3 <- with(d, ifelse(a > 2, 5, -5)) d Saludos, Jorge.- 2012/6/3 Otto F. Wagner <>> * > * > * > * > Hola, tengo una duda. Estoy intentando reproducir algo que hago a diario en > SAS en el trabajo. > > Data tabla2; > set tabla1; > if var1>5 then var2="+5"; > else var2="-5"; > run; > > Estoy intentando hacer este ejemplo con R porque me gustaría replicar todo > lo que sé de SAS en R. > > Sé que el IF de R no es vectorial pero por lo que he visto en internet se > puede arreglar con un bucle. La función IFELSE me gusta menos porque creo > que para anidar 3 o más if es poco esquemática. Otra alternativa sería usar > sqldf pero como os decía en internet he visto el tema de mezclar bucles con > IF. > > Os pongo lo que he hecho y el error porque no encuentro el fallo. > > a<-c(1,2,3,12,13) > b<-c("a","b","c","d","e") > > > Mi script: > > data<-(c(a ,b)) > dim(data)<-c(5,2) > data<-data.frame(data) > nrow(data) > > > > > data$X3<-c("a","b","c","d","e") ## no sé si es necesario crear antes la > columna pero por si las flies la creo > > for (i in 1:nrow(data)){if (data$X1[i]>5) {data$X3[i]<-"F"}} > > > La consola de R: > > for (i in 1:nrow(data)){if (data$X1[i]>5) {data$X3[i]<-"F"}} > Error en if (data$X1[i] > 5) { : > valor ausente donde TRUE/FALSE es necesario > Además: Mensajes de aviso perdidos > In Ops.factor(data$X1[i], 5) : > not meaningful for factors > > Muchas gracias y saludos > > Otto F. > > [[alternative HTML version deleted]] > > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es > >[[alternative HTML version deleted]]
Gracias Jorge, el problema es que la función ifelse es incomoda si encadenas varios: ifelse(cond1,verd,ifelese(cond2,verd,(ifelse()))) por ello mirando en google como usar if else con un bucle for para que actúe fila por fila como si no se trataran de vectores. Supongo que será ifelse la única opción. Saludos El 3 de junio de 2012 18:08, Jorge I Velez <jorgeivanvelez@gmail.com>escribió:> Hola Otto, > > Creo que lo que necesitas es ifelse(): > > a <- c(1,2,3,12,13) > b <- c("a","b","c","d","e") > d <- data.frame(a, b) > d$X3 <- with(d, ifelse(a > 2, 5, -5)) > d > > Saludos, > Jorge.- > > > 2012/6/3 Otto F. Wagner <> > >> * >> * >> * >> * >> >> Hola, tengo una duda. Estoy intentando reproducir algo que hago a diario >> en >> SAS en el trabajo. >> >> Data tabla2; >> set tabla1; >> if var1>5 then var2="+5"; >> else var2="-5"; >> run; >> >> Estoy intentando hacer este ejemplo con R porque me gustaría replicar todo >> lo que sé de SAS en R. >> >> Sé que el IF de R no es vectorial pero por lo que he visto en internet se >> puede arreglar con un bucle. La función IFELSE me gusta menos porque creo >> que para anidar 3 o más if es poco esquemática. Otra alternativa sería >> usar >> sqldf pero como os decía en internet he visto el tema de mezclar bucles >> con >> IF. >> >> Os pongo lo que he hecho y el error porque no encuentro el fallo. >> >> a<-c(1,2,3,12,13) >> b<-c("a","b","c","d","e") >> >> >> Mi script: >> >> data<-(c(a ,b)) >> dim(data)<-c(5,2) >> data<-data.frame(data) >> nrow(data) >> >> >> >> >> data$X3<-c("a","b","c","d","e") ## no sé si es necesario crear antes la >> columna pero por si las flies la creo >> >> for (i in 1:nrow(data)){if (data$X1[i]>5) {data$X3[i]<-"F"}} >> >> >> La consola de R: >> > for (i in 1:nrow(data)){if (data$X1[i]>5) {data$X3[i]<-"F"}} >> Error en if (data$X1[i] > 5) { : >> valor ausente donde TRUE/FALSE es necesario >> Además: Mensajes de aviso perdidos >> In Ops.factor(data$X1[i], 5) : > not meaningful for factors >> >> Muchas gracias y saludos >> >> Otto F. >> >> [[alternative HTML version deleted]] >> >> >> _______________________________________________ >> R-help-es mailing list >> R-help-es@r-project.org >> https://stat.ethz.ch/mailman/listinfo/r-help-es >> >> >[[alternative HTML version deleted]]
Hola Otto, No, no lo es. Tambien existe require(car) ?recode Saludos, Jorge.- 2012/6/3 Otto F. Wagner < <ofwagner@gmail.com>>> Gracias Jorge, el problema es que la función ifelse es incomoda si > encadenas varios: > > ifelse(cond1,verd,ifelese(cond2,verd,(ifelse()))) > > por ello mirando en google como usar if else con un bucle for para que > actúe fila por fila como si no se trataran de vectores. > > Supongo que será ifelse la única opción. > > Saludos > > > > El 3 de junio de 2012 18:08, Jorge I Velez <> escribió: > > Hola Otto, >> >> Creo que lo que necesitas es ifelse(): >> >> a <- c(1,2,3,12,13) >> b <- c("a","b","c","d","e") >> d <- data.frame(a, b) >> d$X3 <- with(d, ifelse(a > 2, 5, -5)) >> d >> >> Saludos, >> Jorge.- >> >> >> 2012/6/3 Otto F. Wagner <> >> >>> * >>> * >>> * >>> * >>> >>> Hola, tengo una duda. Estoy intentando reproducir algo que hago a diario >>> en >>> SAS en el trabajo. >>> >>> Data tabla2; >>> set tabla1; >>> if var1>5 then var2="+5"; >>> else var2="-5"; >>> run; >>> >>> Estoy intentando hacer este ejemplo con R porque me gustaría replicar >>> todo >>> lo que sé de SAS en R. >>> >>> Sé que el IF de R no es vectorial pero por lo que he visto en internet se >>> puede arreglar con un bucle. La función IFELSE me gusta menos porque creo >>> que para anidar 3 o más if es poco esquemática. Otra alternativa sería >>> usar >>> sqldf pero como os decía en internet he visto el tema de mezclar bucles >>> con >>> IF. >>> >>> Os pongo lo que he hecho y el error porque no encuentro el fallo. >>> >>> a<-c(1,2,3,12,13) >>> b<-c("a","b","c","d","e") >>> >>> >>> Mi script: >>> >>> data<-(c(a ,b)) >>> dim(data)<-c(5,2) >>> data<-data.frame(data) >>> nrow(data) >>> >>> >>> >>> >>> data$X3<-c("a","b","c","d","e") ## no sé si es necesario crear antes la >>> columna pero por si las flies la creo >>> >>> for (i in 1:nrow(data)){if (data$X1[i]>5) {data$X3[i]<-"F"}} >>> >>> >>> La consola de R: >>> > for (i in 1:nrow(data)){if (data$X1[i]>5) {data$X3[i]<-"F"}} >>> Error en if (data$X1[i] > 5) { : >>> valor ausente donde TRUE/FALSE es necesario >>> Además: Mensajes de aviso perdidos >>> In Ops.factor(data$X1[i], 5) : > not meaningful for factors >>> >>> Muchas gracias y saludos >>> >>> Otto F. >>> >>> [[alternative HTML version deleted]] >>> >>> >>> _______________________________________________ >>> R-help-es mailing list >>> R-help-es@r-project.org >>> https://stat.ethz.ch/mailman/listinfo/r-help-es >>> >>> >> >[[alternative HTML version deleted]]
Hola, Realmente el problema no es por el "if()", el origen del problema está en la forma en la que defines el data.frame. En la forma en la que lo has definido, la columna data$X1 realmente se ha convertido en un factor:> data$X1[1] 1 2 3 12 13 Levels: 1 12 13 2 3 Si el data.frame lo creas de esta otra forma, más sencilla y compacta desaparece el problema y el bucle funciona sin problemas.> *#data<-(c(a ,b))* > *#dim(data)<-c(5,2)* > *data<-data.frame(X1=a, X2=b)* > nrow(data)[1] 5> > data$X3<-c("a","b","c","d","e") > > data$X1[1] 1 2 3 12 13> > for (i in 1:nrow(data)){+ if (data$X1[i] >5) {data$X3[i]<-"F"} + }> > dataX1 X2 X3 1 1 a a 2 2 b b 3 3 c c 4 12 d *F* 5 13 e *F*>Saludos, Carlos Ortega www.qualityexcellence.es El 3 de junio de 2012 13:13, Otto F. Wagner <ofwagner@gmail.com> escribió:> * > * > * > * > Hola, tengo una duda. Estoy intentando reproducir algo que hago a diario en > SAS en el trabajo. > > Data tabla2; > set tabla1; > if var1>5 then var2="+5"; > else var2="-5"; > run; > > Estoy intentando hacer este ejemplo con R porque me gustaría replicar todo > lo que sé de SAS en R. > > Sé que el IF de R no es vectorial pero por lo que he visto en internet se > puede arreglar con un bucle. La función IFELSE me gusta menos porque creo > que para anidar 3 o más if es poco esquemática. Otra alternativa sería usar > sqldf pero como os decía en internet he visto el tema de mezclar bucles con > IF. > > Os pongo lo que he hecho y el error porque no encuentro el fallo. > > a<-c(1,2,3,12,13) > b<-c("a","b","c","d","e") > > > Mi script: > > data<-(c(a ,b)) > dim(data)<-c(5,2) > data<-data.frame(data) > nrow(data) > > > > > data$X3<-c("a","b","c","d","e") ## no sé si es necesario crear antes la > columna pero por si las flies la creo > > for (i in 1:nrow(data)){if (data$X1[i]>5) {data$X3[i]<-"F"}} > > > La consola de R: > > for (i in 1:nrow(data)){if (data$X1[i]>5) {data$X3[i]<-"F"}} > Error en if (data$X1[i] > 5) { : > valor ausente donde TRUE/FALSE es necesario > Además: Mensajes de aviso perdidos > In Ops.factor(data$X1[i], 5) : > not meaningful for factors > > Muchas gracias y saludos > > Otto F. > > [[alternative HTML version deleted]] > > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es > >-- Saludos, Carlos Ortega www.qualityexcellence.es [[alternative HTML version deleted]]