Hola, Una forma puede ser la siguiente... Para comparar, he creado una nueva columna "new_zona" que es la que se va rellenando con un bucle... #-------------------> cont <- 1 > new_zona <- 0 > for(i in 1:nrow(data)) {+ new_zona[i] <- cont + if(data$Subzona[i] == 1 & i > 1) { + cont <- cont + 1 + new_zona[i] <- cont + } + }> > data$new_zona <- new_zona > dataMargen Zona Subzona Long new_zona 1 B 1 1 9 1 2 B 1 2 12 1 3 B 1 3 22 1 4 B 1 4 36 1 5 B 1 5 36 1 6 B 1 6 98 1 7 B 2 1 58 2 8 B 2 2 47 2 9 B 2 3 54 2 10 B 2 4 87 2 11 B 2 5 26 2 12 B 3 1 36 3 13 A 3 2 35 3 14 A 3 3 91 3 15 A 3 4 10 3 16 A 3 5 20 3 17 A 3 6 36 3 18 A 4 1 57 4 19 A 4 2 30 4 20 A 4 3 69 4 21 A 4 4 32 4 22 A 4 5 33 4 23 A 4 6 36 4 24 A 4 7 37 4>Saludos, Carlos Ortega www.qualityexcellence.es El 13 de febrero de 2018, 22:32, Xavier-Andoni Tibau Alberdi < xavitibau en gmail.com> escribió:> Perdona, toda la razón, no miré bien el problema antes de responder. > > Seguro que hay una manera más eficiente. Pero yo lo haría con un bucle, > luego usas una bariable dummy, digamos zonna_d, que incremente su valor en > 1 cada vez que subzona es ==1. Entonces zona = zonna_d. > > Se entiende? > > Saludos, > > Xavier > > 2018-02-13 22:26 GMT+01:00 Andrés Hirigoyen <andreshirigoyen en gmail.com>: > > > Xavier el tema que no logro solucionar es pasar de subzona==1 a > > subzona==2. Probé con ifelse pero me cambia los valores de toda la > columan > > cuando cambia de zona. > > Gracias por responder > > > > El 13 de febrero de 2018, 18:19, Xavier-Andoni Tibau Alberdi< > > xavitibau en gmail.com> escribió: > > > >> Creo que necesitas usar la funcion: ifelse(). > >> > >> Saludos! > >> > >> El 13 feb. 2018 22:16, "Andrés Hirigoyen" <andreshirigoyen en gmail.com> > >> escribió: > >> > >>> Buenas tardes para tod en s > >>> (de nuevo) > >>> > >>> Tengo el siguiente dataframe: > >>> margen<-c("A","B","A","B","A","B","A","B","A","B","A","B","A > >>> ","B","A","B","A","B","A","B","A","B","A","B") > >>> margen<-sort(margen, decreasing=T) > >>> long<-c(9,12,22,36,36,98,58,47,54,87,26,36,35,91,10,20,36,57 > >>> ,30,69,32,33,36,37) > >>> > >>> subzona<-c(1,2,3,4,5,6,1,2,3,4,5,1,2,3,4,5,6,1,2,3,4,5,6,7) > >>> zona<-c(1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4,4) > >>> > >>> data<-data.frame(Margen=margen, Zona=zona, Subzona=subzona,Long=long) > >>> > >>> La Variable "zona" es creada a mano cuando dentro de un mismo "Margen" > la > >>> "subzona"==1. > >>> Luego sigue valiendo 1 a medida que las observaciones de la "subzona" > >>> avanzan (1,2,...n) . Cuando aparece una nueva observación ("subzona") > con > >>> el número 1, la "zona" cambia a 2 , luego a 3 etc. hasta q inicia en 1 > >>> cuando cambio de "Margen" > >>> > >>> Me gustaría crear la variable Zona de forma automática, es decir cuando > >>> la > >>> "subzona"==1, "zona" valdría 1, hasta que "subzona" valga 1 de nuevo > allí > >>> la "zona" valdrá 2 y así sucesivamente (hasta que cambie a "Margen"==2 > e > >>> inicia de nuevo). > >>> Estoy con terribles líos con if ifelse loops... Espero haber sido claro > >>> > >>> Saludos y desde ya muchas gracias > >>> > >>> > >>> > >>> -- > >>> > >>> [[alternative HTML version deleted]] > >>> > >>> _______________________________________________ > >>> R-help-es mailing list > >>> R-help-es en r-project.org > >>> https://stat.ethz.ch/mailman/listinfo/r-help-es > >>> > >> > > > > > > -- > > *Andrés Hirigoyen* > > * Prof. Ciencias Biológicas* > > *Ing. Agr. Forestal (MSc) * > > > > *http://andreshirigoyen.com/web/ <http://andreshirigoyen.com/web/>* > > > > [[alternative HTML version deleted]] > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es >-- Saludos, Carlos Ortega www.qualityexcellence.es [[alternative HTML version deleted]]
Excelente Carlos, muchas gracias. Me maree con [i] en el bucle que hacia. Saludos El 13 de febrero de 2018, 18:38, Carlos Ortega<cof en qualityexcellence.es> escribió:> Hola, > > Una forma puede ser la siguiente... > Para comparar, he creado una nueva columna "new_zona" que es la que se va > rellenando con un bucle... > > #------------------- > > cont <- 1 > > new_zona <- 0 > > for(i in 1:nrow(data)) { > + new_zona[i] <- cont > + if(data$Subzona[i] == 1 & i > 1) { > + cont <- cont + 1 > + new_zona[i] <- cont > + } > + } > > > > data$new_zona <- new_zona > > data > Margen Zona Subzona Long new_zona > 1 B 1 1 9 1 > 2 B 1 2 12 1 > 3 B 1 3 22 1 > 4 B 1 4 36 1 > 5 B 1 5 36 1 > 6 B 1 6 98 1 > 7 B 2 1 58 2 > 8 B 2 2 47 2 > 9 B 2 3 54 2 > 10 B 2 4 87 2 > 11 B 2 5 26 2 > 12 B 3 1 36 3 > 13 A 3 2 35 3 > 14 A 3 3 91 3 > 15 A 3 4 10 3 > 16 A 3 5 20 3 > 17 A 3 6 36 3 > 18 A 4 1 57 4 > 19 A 4 2 30 4 > 20 A 4 3 69 4 > 21 A 4 4 32 4 > 22 A 4 5 33 4 > 23 A 4 6 36 4 > 24 A 4 7 37 4 > > > > Saludos, > Carlos Ortega > www.qualityexcellence.es > > > > El 13 de febrero de 2018, 22:32, Xavier-Andoni Tibau Alberdi < > xavitibau en gmail.com> escribió: > >> Perdona, toda la razón, no miré bien el problema antes de responder. >> >> Seguro que hay una manera más eficiente. Pero yo lo haría con un bucle, >> luego usas una bariable dummy, digamos zonna_d, que incremente su valor en >> 1 cada vez que subzona es ==1. Entonces zona = zonna_d. >> >> Se entiende? >> >> Saludos, >> >> Xavier >> >> 2018-02-13 22:26 GMT+01:00 Andrés Hirigoyen <andreshirigoyen en gmail.com>: >> >> > Xavier el tema que no logro solucionar es pasar de subzona==1 a >> > subzona==2. Probé con ifelse pero me cambia los valores de toda la >> columan >> > cuando cambia de zona. >> > Gracias por responder >> > >> > El 13 de febrero de 2018, 18:19, Xavier-Andoni Tibau Alberdi< >> > xavitibau en gmail.com> escribió: >> > >> >> Creo que necesitas usar la funcion: ifelse(). >> >> >> >> Saludos! >> >> >> >> El 13 feb. 2018 22:16, "Andrés Hirigoyen" <andreshirigoyen en gmail.com> >> >> escribió: >> >> >> >>> Buenas tardes para tod en s >> >>> (de nuevo) >> >>> >> >>> Tengo el siguiente dataframe: >> >>> margen<-c("A","B","A","B","A","B","A","B","A","B","A","B","A >> >>> ","B","A","B","A","B","A","B","A","B","A","B") >> >>> margen<-sort(margen, decreasing=T) >> >>> long<-c(9,12,22,36,36,98,58,47,54,87,26,36,35,91,10,20,36,57 >> >>> ,30,69,32,33,36,37) >> >>> >> >>> subzona<-c(1,2,3,4,5,6,1,2,3,4,5,1,2,3,4,5,6,1,2,3,4,5,6,7) >> >>> zona<-c(1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4,4) >> >>> >> >>> data<-data.frame(Margen=margen, Zona=zona, >> Subzona=subzona,Long=long) >> >>> >> >>> La Variable "zona" es creada a mano cuando dentro de un mismo >> "Margen" la >> >>> "subzona"==1. >> >>> Luego sigue valiendo 1 a medida que las observaciones de la "subzona" >> >>> avanzan (1,2,...n) . Cuando aparece una nueva observación ("subzona") >> con >> >>> el número 1, la "zona" cambia a 2 , luego a 3 etc. hasta q inicia en 1 >> >>> cuando cambio de "Margen" >> >>> >> >>> Me gustaría crear la variable Zona de forma automática, es decir >> cuando >> >>> la >> >>> "subzona"==1, "zona" valdría 1, hasta que "subzona" valga 1 de nuevo >> allí >> >>> la "zona" valdrá 2 y así sucesivamente (hasta que cambie a >> "Margen"==2 e >> >>> inicia de nuevo). >> >>> Estoy con terribles líos con if ifelse loops... Espero haber sido >> claro >> >>> >> >>> Saludos y desde ya muchas gracias >> >>> >> >>> >> >>> >> >>> -- >> >>> >> >>> [[alternative HTML version deleted]] >> >>> >> >>> _______________________________________________ >> >>> R-help-es mailing list >> >>> R-help-es en r-project.org >> >>> https://stat.ethz.ch/mailman/listinfo/r-help-es >> >>> >> >> >> > >> > >> > -- >> > *Andrés Hirigoyen* >> > * Prof. Ciencias Biológicas* >> > *Ing. Agr. Forestal (MSc) * >> > >> > *http://andreshirigoyen.com/web/ <http://andreshirigoyen.com/web/>* >> > >> >> [[alternative HTML version deleted]] >> >> _______________________________________________ >> R-help-es mailing list >> R-help-es en r-project.org >> https://stat.ethz.ch/mailman/listinfo/r-help-es >> > > > > -- > Saludos, > Carlos Ortega > www.qualityexcellence.es >-- *Andrés Hirigoyen* * Prof. Ciencias Biológicas* *Ing. Agr. Forestal (MSc) * *http://andreshirigoyen.com/web/ <http://andreshirigoyen.com/web/>* [[alternative HTML version deleted]]
Buenas: Una forma sin bucles:> data <- read.table("/tmp/a.csv", header=TRUE, sep="",na.strings="NA", dec=".", strip.white=TRUE)> new_zon <- as.numeric(diff(data$Subzona) < 0) > new_zon <- c(1, new_zon) > new_zon <- cumsum(new_zon) > data$new_zon <- new_zon > dataMargen Zona Subzona Long new_zona new_zon 1 B 1 1 9 1 1 2 B 1 2 12 1 1 3 B 1 3 22 1 1 4 B 1 4 36 1 1 5 B 1 5 36 1 1 6 B 1 6 98 1 1 7 B 2 1 58 2 2 8 B 2 2 47 2 2 9 B 2 3 54 2 2 10 B 2 4 87 2 2 11 B 2 5 26 2 2 12 B 3 1 36 3 3 13 A 3 2 35 3 3 14 A 3 3 91 3 3 15 A 3 4 10 3 3 16 A 3 5 20 3 3 17 A 3 6 36 3 3 18 A 4 1 57 4 4 19 A 4 2 30 4 4 20 A 4 3 69 4 4 21 A 4 4 32 4 4 22 A 4 5 33 4 4 23 A 4 6 36 4 4 24 A 4 7 37 4 4 Un saludo. El mar, 13-02-2018 a las 18:42 -0300, Andrés Hirigoyen escribió:> Excelente Carlos, muchas gracias. Me maree con [i] en el bucle que > hacia. > Saludos > > > > El 13 de febrero de 2018, 18:38, Carlos Ortega<cof en qualityexcellence. > es> > escribió: > > > Hola, > > > > Una forma puede ser la siguiente... > > Para comparar, he creado una nueva columna "new_zona" que es la que > > se va > > rellenando con un bucle... > > > > #------------------- > > > cont <- 1 > > > new_zona <- 0 > > > for(i in 1:nrow(data)) { > > > > + new_zona[i] <- cont > > + if(data$Subzona[i] == 1 & i > 1) { > > + cont <- cont + 1 > > + new_zona[i] <- cont > > + } > > + } > > > > > > data$new_zona <- new_zona > > > data > > > > Margen Zona Subzona Long new_zona > > 1 B 1 1 9 1 > > 2 B 1 2 12 1 > > 3 B 1 3 22 1 > > 4 B 1 4 36 1 > > 5 B 1 5 36 1 > > 6 B 1 6 98 1 > > 7 B 2 1 58 2 > > 8 B 2 2 47 2 > > 9 B 2 3 54 2 > > 10 B 2 4 87 2 > > 11 B 2 5 26 2 > > 12 B 3 1 36 3 > > 13 A 3 2 35 3 > > 14 A 3 3 91 3 > > 15 A 3 4 10 3 > > 16 A 3 5 20 3 > > 17 A 3 6 36 3 > > 18 A 4 1 57 4 > > 19 A 4 2 30 4 > > 20 A 4 3 69 4 > > 21 A 4 4 32 4 > > 22 A 4 5 33 4 > > 23 A 4 6 36 4 > > 24 A 4 7 37 4 > > > > > > > Saludos, > > Carlos Ortega > > www.qualityexcellence.es > > > > > > > > El 13 de febrero de 2018, 22:32, Xavier-Andoni Tibau Alberdi < > > xavitibau en gmail.com> escribió: > > > > > Perdona, toda la razón, no miré bien el problema antes de > > > responder. > > > > > > Seguro que hay una manera más eficiente. Pero yo lo haría con un > > > bucle, > > > luego usas una bariable dummy, digamos zonna_d, que incremente su > > > valor en > > > 1 cada vez que subzona es ==1. Entonces zona = zonna_d. > > > > > > Se entiende? > > > > > > Saludos, > > > > > > Xavier > > > > > > 2018-02-13 22:26 GMT+01:00 Andrés Hirigoyen <andreshirigoyen en gmai > > > l.com>: > > > > > > > Xavier el tema que no logro solucionar es pasar de subzona==1 a > > > > subzona==2. Probé con ifelse pero me cambia los valores de toda > > > > la > > > > > > columan > > > > cuando cambia de zona. > > > > Gracias por responder > > > > > > > > El 13 de febrero de 2018, 18:19, Xavier-Andoni Tibau Alberdi< > > > > xavitibau en gmail.com> escribió: > > > > > > > > > Creo que necesitas usar la funcion: ifelse(). > > > > > > > > > > Saludos! > > > > > > > > > > El 13 feb. 2018 22:16, "Andrés Hirigoyen" <andreshirigoyen en gm > > > > > ail.com> > > > > > escribió: > > > > > > > > > > > Buenas tardes para tod en s > > > > > > (de nuevo) > > > > > > > > > > > > Tengo el siguiente dataframe: > > > > > > margen<- > > > > > > c("A","B","A","B","A","B","A","B","A","B","A","B","A > > > > > > ","B","A","B","A","B","A","B","A","B","A","B") > > > > > > margen<-sort(margen, decreasing=T) > > > > > > long<- > > > > > > c(9,12,22,36,36,98,58,47,54,87,26,36,35,91,10,20,36,57 > > > > > > ,30,69,32,33,36,37) > > > > > > > > > > > > subzona<-c(1,2,3,4,5,6,1,2,3,4,5,1,2,3,4,5,6,1,2,3,4,5,6,7) > > > > > > zona<-c(1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4,4) > > > > > > > > > > > > data<-data.frame(Margen=margen, Zona=zona, > > > > > > Subzona=subzona,Long=long) > > > > > > > > > > > > La Variable "zona" es creada a mano cuando dentro de un > > > > > > mismo > > > > > > "Margen" la > > > > > > "subzona"==1. > > > > > > Luego sigue valiendo 1 a medida que las observaciones de la > > > > > > "subzona" > > > > > > avanzan (1,2,...n) . Cuando aparece una nueva observación > > > > > > ("subzona") > > > > > > con > > > > > > el número 1, la "zona" cambia a 2 , luego a 3 etc. hasta q > > > > > > inicia en 1 > > > > > > cuando cambio de "Margen" > > > > > > > > > > > > Me gustaría crear la variable Zona de forma automática, es > > > > > > decir > > > > > > cuando > > > > > > la > > > > > > "subzona"==1, "zona" valdría 1, hasta que "subzona" valga 1 > > > > > > de nuevo > > > > > > allí > > > > > > la "zona" valdrá 2 y así sucesivamente (hasta que cambie a > > > > > > "Margen"==2 e > > > > > > inicia de nuevo). > > > > > > Estoy con terribles líos con if ifelse loops... Espero > > > > > > haber sido > > > > > > claro > > > > > > > > > > > > Saludos y desde ya muchas gracias > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > > > > > > > > > [[alternative HTML version deleted]] > > > > > > > > > > > > _______________________________________________ > > > > > > R-help-es mailing list > > > > > > R-help-es en r-project.org > > > > > > https://stat.ethz.ch/mailman/listinfo/r-help-es > > > > > > > > > > > > > > > > > > -- > > > > *Andrés Hirigoyen* > > > > * Prof. Ciencias Biológicas* > > > > *Ing. Agr. Forestal (MSc) * > > > > > > > > *http://andreshirigoyen.com/web/ <http://andreshirigoyen.com/we > > > > b/>* > > > > > > > > > > [[alternative HTML version deleted]] > > > > > > _______________________________________________ > > > R-help-es mailing list > > > R-help-es en r-project.org > > > https://stat.ethz.ch/mailman/listinfo/r-help-es > > > > > > > > > > > -- > > Saludos, > > Carlos Ortega > > www.qualityexcellence.es > > > > >