[R-es] Crear bucle

Proyecto R-UCA r-uca en uca.es
Mie Feb 14 07:45:41 CET 2018


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
> data
   Margen 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
> > 
> 
> 
> 



Más información sobre la lista de distribución R-help-es