J Manel S Griño
2011-Jun-14 15:29 UTC
[R-es] Bucle for i generación de variables en un data.frame
Hola a tod@s, Llevo varios días intentando resolver esta duda y no hay manera. Debo decir que és una de mis primeras incursiones en la programación de bucles con R. Lo que yo quiero es añadir una columna nueva al data.frame "recuentos" para cada incremento en "datos$codigo1" con el resultado de la suma de los valores de "datos$total" para cada cambio en "datos$identificador". Mi problema es que no sé cómo ordenarle que cada ariable contenga el número de iteració "i". for (i in 1:max(datos$codigo1,na.rm=T)) recuento$variablenueva.*i* <-tapply(subset(datos$total,datos$codigo1==i),subset(dagot$identificador,datos$codigo1==i),sum,na.rm=T) También estoy abierto a otras soluciones que me ahorren las más de 300 líneas de código que tendria que escribir para recoger todas las posibilidades [max(datos$codigo1,na.rm=T)>350 por ahora...]. Muchas gracias! Saludos, Manel. [[alternative HTML version deleted]]
Carlos J. Gil Bellosta
2011-Jun-14 15:42 UTC
[R-es] Bucle for i generación de variables en un data.frame
Hola, ¿qué tal? Seguramente, te interesará la función "by". Con "by" puedes partir automáticamente el df datos por el valor del código1 y aplicar una función a cada trozo. Después puedes modificar el objeto creado (de ser necesario) y asignárselo a recuento. Si te sientes torero, puedes aprender a usar el paquete plyr: a medio plazo, saldrás ganando. Un saludo, Carlos J. Gil Bellosta http://www.datanalytics.com El día 14 de junio de 2011 17:29, J Manel S Griño <jmanelsg en gmail.com> escribió:> Hola a tod en s, > > Llevo varios días intentando resolver esta duda y no hay manera. Debo decir > que és una de mis primeras incursiones en la programación de bucles con R. > Lo que yo quiero es añadir una columna nueva al data.frame "recuentos" para > cada incremento en "datos$codigo1" con el resultado de la suma de los > valores de "datos$total" para cada cambio en "datos$identificador". Mi > problema es que no sé cómo ordenarle que cada ariable contenga el número de > iteració "i". > > for (i in 1:max(datos$codigo1,na.rm=T)) > recuento$variablenueva.*i* > <-tapply(subset(datos$total,datos$codigo1==i),subset(dagot$identificador,datos$codigo1==i),sum,na.rm=T) > > > También estoy abierto a otras soluciones que me ahorren las más de 300 > líneas de código que tendria que escribir para recoger todas las > posibilidades [max(datos$codigo1,na.rm=T)>350 por ahora...]. > > Muchas gracias! > > Saludos, > > Manel. > > [[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 > >
Luciano Selzer
2011-Jun-14 15:42 UTC
[R-es] Bucle for i generación de variables en un data.frame
Manel, dentro de un bucle no podes crear variables. Tenes que inicializarlas antes de el. Lo del nombre de la columna sería mejor hacerlo después del bucle, total es incremental. Una forma de evitar el bucle es usar el paquete plyr. Usando la función ddply. Un ejemplo sería algo así: ddply(datas, .(codigo, identificador), sum, na.rm = T) Espero que sirva Luciano El 14 de junio de 2011 12:29, J Manel S Griño <jmanelsg@gmail.com> escribió:> Hola a tod@s, > > Llevo varios días intentando resolver esta duda y no hay manera. Debo decir > que és una de mis primeras incursiones en la programación de bucles con R. > Lo que yo quiero es añadir una columna nueva al data.frame "recuentos" para > cada incremento en "datos$codigo1" con el resultado de la suma de los > valores de "datos$total" para cada cambio en "datos$identificador". Mi > problema es que no sé cómo ordenarle que cada ariable contenga el número de > iteració "i". > > for (i in 1:max(datos$codigo1,na.rm=T)) > recuento$variablenueva.*i* > > <-tapply(subset(datos$total,datos$codigo1==i),subset(dagot$identificador,datos$codigo1==i),sum,na.rm=T) > > > También estoy abierto a otras soluciones que me ahorren las más de 300 > líneas de código que tendria que escribir para recoger todas las > posibilidades [max(datos$codigo1,na.rm=T)>350 por ahora...]. > > Muchas gracias! > > Saludos, > > Manel. > > [[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]]
Carlos Ortega
2011-Jun-14 15:42 UTC
[R-es] Bucle for i generación de variables en un data.frame
Hola, Esta podría ser una solución, sujeta a alguna depuración a falta de un ejemplo más reproducible que pudieras enviar: ###################################### recuentos<-0 cont.suma<-0 for(i in 1:length(datos$codigo1) ) { if(i==1) { cont.suma<-cont.suma + datos$identificador[i] recuentos[i]<-cont.suma } else if(datos$identificador[i]==datos$identificador[i-1]) { cont.suma<-cont.suma + datos$identificador[i] recuentos[i]<-0 } else if(datos$identificador[i]!=datos$identificador[i-1]) { cont.suma<-cont.suma + datos$identificador[i] recuentos[i]<-cont.suma cont.suma<-0 } } #for(i in... ###################################### Saludos, Carlos Ortega www.qualityexcellence.es 2011/6/14 J Manel S Griño <jmanelsg@gmail.com>> Hola a tod@s, > > Llevo varios días intentando resolver esta duda y no hay manera. Debo decir > que és una de mis primeras incursiones en la programación de bucles con R. > Lo que yo quiero es añadir una columna nueva al data.frame "recuentos" para > cada incremento en "datos$codigo1" con el resultado de la suma de los > valores de "datos$total" para cada cambio en "datos$identificador". Mi > problema es que no sé cómo ordenarle que cada ariable contenga el número de > iteració "i". > > for (i in 1:max(datos$codigo1,na.rm=T)) > recuento$variablenueva.*i* > > <-tapply(subset(datos$total,datos$codigo1==i),subset(dagot$identificador,datos$codigo1==i),sum,na.rm=T) > > > También estoy abierto a otras soluciones que me ahorren las más de 300 > líneas de código que tendria que escribir para recoger todas las > posibilidades [max(datos$codigo1,na.rm=T)>350 por ahora...]. > > Muchas gracias! > > Saludos, > > Manel. > > [[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]]
Jorge Ivan Velez
2011-Jun-14 15:42 UTC
[R-es] Bucle for i generación de variables en un data.frame
Hola Manel, Creo que es mas facil trabajar hacer un split() de los datos por codigo1 y luego hacer las sumas correspodientes utilizando lapply(). De esta forma evitas el for() y los "==" dentro de el. Podrias enviarnos una porcion de los datos via dput() o a traves de un link en Dropbox u otro servidor? Otras alternativas que podrias explorar son aggregate() y ddply {plyr}. Un saludo, Jorge Ivan Velez 2011/6/14 J Manel S Griño <>> Hola a tod@s, > > Llevo varios días intentando resolver esta duda y no hay manera. Debo decir > que és una de mis primeras incursiones en la programación de bucles con R. > Lo que yo quiero es añadir una columna nueva al data.frame "recuentos" para > cada incremento en "datos$codigo1" con el resultado de la suma de los > valores de "datos$total" para cada cambio en "datos$identificador". Mi > problema es que no sé cómo ordenarle que cada ariable contenga el número de > iteració "i". > > for (i in 1:max(datos$codigo1,na.rm=T)) > recuento$variablenueva.*i* > > <-tapply(subset(datos$total,datos$codigo1==i),subset(dagot$identificador,datos$codigo1==i),sum,na.rm=T) > > > También estoy abierto a otras soluciones que me ahorren las más de 300 > líneas de código que tendria que escribir para recoger todas las > posibilidades [max(datos$codigo1,na.rm=T)>350 por ahora...]. > > Muchas gracias! > > Saludos, > > Manel. > > [[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]]
Jorge Ivan Velez
2011-Jun-14 15:47 UTC
[R-es] Bucle for i generación de variables en un data.frame
Hola Luciano, Si podrias pero no es recomendable; la funcion para ello es "assign". Un saludo, Jorge 2011/6/14 Luciano Selzer <>> Manel, dentro de un bucle no podes crear variables. Tenes que > inicializarlas > antes de el. Lo del nombre de la columna sería mejor hacerlo después del > bucle, total es incremental. Una forma de evitar el bucle es usar el > paquete > plyr. Usando la función ddply. Un ejemplo sería algo así: > > ddply(datas, .(codigo, identificador), sum, na.rm = T) > > Espero que sirva > Luciano > > > El 14 de junio de 2011 12:29, J Manel S Griño <> escribió: > > > Hola a tod@s, > > > > Llevo varios días intentando resolver esta duda y no hay manera. Debo > decir > > que és una de mis primeras incursiones en la programación de bucles con > R. > > Lo que yo quiero es añadir una columna nueva al data.frame "recuentos" > para > > cada incremento en "datos$codigo1" con el resultado de la suma de los > > valores de "datos$total" para cada cambio en "datos$identificador". Mi > > problema es que no sé cómo ordenarle que cada ariable contenga el número > de > > iteració "i". > > > > for (i in 1:max(datos$codigo1,na.rm=T)) > > recuento$variablenueva.*i* > > > > > <-tapply(subset(datos$total,datos$codigo1==i),subset(dagot$identificador,datos$codigo1==i),sum,na.rm=T) > > > > > > También estoy abierto a otras soluciones que me ahorren las más de 300 > > líneas de código que tendria que escribir para recoger todas las > > posibilidades [max(datos$codigo1,na.rm=T)>350 por ahora...]. > > > > Muchas gracias! > > > > Saludos, > > > > Manel. > > > > [[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]] > > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es > >[[alternative HTML version deleted]]
Javier Muñoz
2011-Jun-14 15:48 UTC
[R-es] Bucle for i generación de variables en un data.frame
Es posible que lo quieras sea esto?: recuento <- with(datos, tapply(total, list(identificador, codigo1), sum, na.rm = T)) El 14 de junio de 2011 17:29, J Manel S Griño <jmanelsg@gmail.com> escribió:> Hola a tod@s, > > Llevo varios días intentando resolver esta duda y no hay manera. Debo decir > que és una de mis primeras incursiones en la programación de bucles con R. > Lo que yo quiero es añadir una columna nueva al data.frame "recuentos" para > cada incremento en "datos$codigo1" con el resultado de la suma de los > valores de "datos$total" para cada cambio en "datos$identificador". Mi > problema es que no sé cómo ordenarle que cada ariable contenga el número de > iteració "i". > > for (i in 1:max(datos$codigo1,na.rm=T)) > recuento$variablenueva.*i* > > <-tapply(subset(datos$total,datos$codigo1==i),subset(dagot$identificador,datos$codigo1==i),sum,na.rm=T) > > > También estoy abierto a otras soluciones que me ahorren las más de 300 > líneas de código que tendria que escribir para recoger todas las > posibilidades [max(datos$codigo1,na.rm=T)>350 por ahora...]. > > Muchas gracias! > > Saludos, > > Manel. > > [[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]]
Carlos Ortega
2011-Jun-14 15:48 UTC
[R-es] Bucle for i generación de variables en un data.frame
O utilizar el paquete sqldf donde la consulta sobre tu data.frame sería tan sencillo como algo esto: a15s <- sqldf("select sum(wool = ''A''), sum(wool = ''B'') from warpbreaks group by tension") Donde tu agrupador sería "datos$identificador". Saludos, Carlos Ortega www.qualityexcellence.es 2011/6/14 Carlos Ortega <coforfe@gmail.com>> Hola, > > Esta podría ser una solución, sujeta a alguna depuración a falta de un > ejemplo más reproducible que pudieras enviar: > > ###################################### > recuentos<-0 > cont.suma<-0 > > for(i in 1:length(datos$codigo1) ) { > > if(i==1) { > cont.suma<-cont.suma + datos$identificador[i] > recuentos[i]<-cont.suma > } else if(datos$identificador[i]==datos$identificador[i-1]) { > cont.suma<-cont.suma + datos$identificador[i] > recuentos[i]<-0 > } else if(datos$identificador[i]!=datos$identificador[i-1]) { > cont.suma<-cont.suma + datos$identificador[i] > recuentos[i]<-cont.suma > cont.suma<-0 > } > > } #for(i in... > > ###################################### > > Saludos, > Carlos Ortega > www.qualityexcellence.es > > > 2011/6/14 J Manel S Griño <jmanelsg@gmail.com> > >> Hola a tod@s, >> >> Llevo varios días intentando resolver esta duda y no hay manera. Debo >> decir >> que és una de mis primeras incursiones en la programación de bucles con R. >> Lo que yo quiero es añadir una columna nueva al data.frame "recuentos" >> para >> cada incremento en "datos$codigo1" con el resultado de la suma de los >> valores de "datos$total" para cada cambio en "datos$identificador". Mi >> problema es que no sé cómo ordenarle que cada ariable contenga el número >> de >> iteració "i". >> >> for (i in 1:max(datos$codigo1,na.rm=T)) >> recuento$variablenueva.*i* >> >> <-tapply(subset(datos$total,datos$codigo1==i),subset(dagot$identificador,datos$codigo1==i),sum,na.rm=T) >> >> >> También estoy abierto a otras soluciones que me ahorren las más de 300 >> líneas de código que tendria que escribir para recoger todas las >> posibilidades [max(datos$codigo1,na.rm=T)>350 por ahora...]. >> >> Muchas gracias! >> >> Saludos, >> >> Manel. >> >> [[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]]
J Manel S Griño
2011-Jun-14 16:02 UTC
[R-es] Bucle for i generación de variables en un data.frame
Muchas gracias a todos. Realmente me estava complicando la vida. He provado la solución de Javier Muñoz y es exactamente lo que queria. De todas formas provaré las otras soluciones. Saludos, Manel. 2011/6/14 Carlos Ortega <coforfe@gmail.com>> O utilizar el paquete sqldf donde la consulta sobre tu data.frame sería tan > sencillo como algo esto: > > a15s <- sqldf("select sum(wool = ''A''), sum(wool = ''B'') > from warpbreaks group by tension") > > Donde tu agrupador sería "datos$identificador". > > Saludos, > Carlos Ortega > www.qualityexcellence.es > > > 2011/6/14 Carlos Ortega <coforfe@gmail.com> > >> Hola, >> >> Esta podría ser una solución, sujeta a alguna depuración a falta de un >> ejemplo más reproducible que pudieras enviar: >> >> ###################################### >> recuentos<-0 >> cont.suma<-0 >> >> for(i in 1:length(datos$codigo1) ) { >> >> if(i==1) { >> cont.suma<-cont.suma + datos$identificador[i] >> recuentos[i]<-cont.suma >> } else if(datos$identificador[i]==datos$identificador[i-1]) { >> cont.suma<-cont.suma + datos$identificador[i] >> recuentos[i]<-0 >> } else if(datos$identificador[i]!=datos$identificador[i-1]) { >> cont.suma<-cont.suma + datos$identificador[i] >> recuentos[i]<-cont.suma >> cont.suma<-0 >> } >> >> } #for(i in... >> >> ###################################### >> >> Saludos, >> Carlos Ortega >> www.qualityexcellence.es >> >> >> 2011/6/14 J Manel S Griño <jmanelsg@gmail.com> >> >>> Hola a tod@s, >>> >>> Llevo varios días intentando resolver esta duda y no hay manera. Debo >>> decir >>> que és una de mis primeras incursiones en la programación de bucles con >>> R. >>> Lo que yo quiero es añadir una columna nueva al data.frame "recuentos" >>> para >>> cada incremento en "datos$codigo1" con el resultado de la suma de los >>> valores de "datos$total" para cada cambio en "datos$identificador". Mi >>> problema es que no sé cómo ordenarle que cada ariable contenga el número >>> de >>> iteració "i". >>> >>> for (i in 1:max(datos$codigo1,na.rm=T)) >>> recuento$variablenueva.*i* >>> >>> <-tapply(subset(datos$total,datos$codigo1==i),subset(dagot$identificador,datos$codigo1==i),sum,na.rm=T) >>> >>> >>> También estoy abierto a otras soluciones que me ahorren las más de 300 >>> líneas de código que tendria que escribir para recoger todas las >>> posibilidades [max(datos$codigo1,na.rm=T)>350 por ahora...]. >>> >>> Muchas gracias! >>> >>> Saludos, >>> >>> Manel. >>> >>> [[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]]
Oscar Perpiñan Lamigueiro
2011-Jun-15 12:57 UTC
[R-es] Bucle for i generación de variables en un data.frame
Otra forma equivalente, usando el método para fórmulas de aggregate: ##me invento un data.frame cualquiera: df <- data.frame(x=rnorm(100), y=rep(letters[1:5], 4), z=rep(letters[6:9], 5)) ##sumamos en base a las categorías y, z ag <- aggregate(x ~ y+z, data=df, FUN=sum) ##si no hubiera más variables puedes usar la notación dot: ag <- aggregate(x ~ ., data=df, FUN=sum) ##Y para ponerlo en formato tabla (similar al resultado con tapply): xtabs(x ~ y + z, data=ag) xtabs(x ~ ., data=ag) Saludos. Oscar. El Tue, 14 Jun 2011 17:48:04 +0200 Javier Muñoz <javimunozlara en gmail.com> escribió:> Es posible que lo quieras sea esto?: > > recuento <- with(datos, tapply(total, list(identificador, codigo1), > sum, na.rm = T)) > > El 14 de junio de 2011 17:29, J Manel S Griño <jmanelsg en gmail.com> > escribió: > > > Hola a tod en s, > > > > Llevo varios días intentando resolver esta duda y no hay manera. > > Debo decir que és una de mis primeras incursiones en la > > programación de bucles con R. Lo que yo quiero es añadir una > > columna nueva al data.frame "recuentos" para cada incremento en > > "datos$codigo1" con el resultado de la suma de los valores de > > "datos$total" para cada cambio en "datos$identificador". Mi > > problema es que no sé cómo ordenarle que cada ariable contenga el > > número de iteració "i". > > > > for (i in 1:max(datos$codigo1,na.rm=T)) > > recuento$variablenueva.*i* > > > > <-tapply(subset(datos$total,datos$codigo1==i),subset(dagot$identificador,datos$codigo1==i),sum,na.rm=T) > > > > > > También estoy abierto a otras soluciones que me ahorren las más de > > 300 líneas de código que tendria que escribir para recoger todas las > > posibilidades [max(datos$codigo1,na.rm=T)>350 por ahora...]. > > > > Muchas gracias! > > > > Saludos, > > > > Manel. > > > > [[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 > > > > > > [[alternative HTML version deleted]] >