Hola Eric. Muchas gracias por tu respuesta. Intenté hacer lo mismo sobre una variable agregada a datos, de modo: datos$p_Valores <- datos[, Valores/sum(Valores), by=MesAño] pero no funciona, porque pega un data.table en una única variable: In `[<-.data.table`(x, j = name, value = value) : Supplied 2 items to be assigned to 5849 items of column 'pValores' (recycled leaving remainder of 1 items). El cálculo es correcto, pero si: head(datos) #Solo copio y pego la columna de interés: pValores 1: 2011-1,2011-1,2011-1,2011-1,2011-1,2011-1, 2: 0.17677003,0.08411600,0.06379952,0.05113864,0.04911275,0.04214248, 3: 2011-1,2011-1,2011-1,2011-1,2011-1,2011-1, 4: 0.17677003,0.08411600,0.06379952,0.05113864,0.04911275,0.04214248, 5: 2011-1,2011-1,2011-1,2011-1,2011-1,2011-1, 6: 0.17677003,0.08411600,0.06379952,0.05113864,0.04911275,0.04214248, Luego, puedo crear un objeto, tal como vos hacés, y luego darle pegar la segunda variable, que es la que contiene mis datos de interés. Pero sigue siendo una forma larga... debo crear, estimar y pegar (y siempre me da "miedo" pegar).- Por eso consultaba por una función que lo hiciera. Saludos!! El 17 de agosto de 2016, 14:47, eric <ericconchamunoz en gmail.com> escribió:> Para calculos sobre data.frame agrupando por niveles de una variable la > libreria data.table va muy bien: > > > install.packages(data.table) > > library(data.table) > > x ejemplo, con tu data.frame podrias calcular: > > tmp <- read.csv("datos.csv", header=TRUE) > tmp <- as.data.table(tmp) > tmp[, mean(Valores), by=Mes] > > Mes V1 > 1: 1 100.625 > 2: 2 125.300 > 3: 3 102.750 > > > o por año > > tmp[, mean(Valores), by=Agno] > Agno V1 > 1: 2015 116.7692 > 2: 2016 105.6667 > > > la expresion mean(Valores) la puedes cambiar por el calculo que tu > necesitas hacer. > > al leer el archivo tuve problemas con la Ñ, asi es que la cambie. > > Saludos, > > eric. > > > > > > > On 08/17/2016 11:31 AM, Mauricio Monsalvo wrote: > >> Hola. >> Necesito calcular los porcentajes de un valor dado (valores) como >> porcentaje de la suma de ese mismo valor pero agrupando por una tercera >> columna (en este caso, podría ser Mes-Año). El resultado sería el que se >> ve en la var: "EnR" >> Necesito además que ese resultado quede pegado en mi data.frame. >> AñoMesAñoMesFactorValoresenR >> 201512015-1a1050.25 >> 201512015-1b1040.24 >> 201512015-1c1090.25 >> 201512015-1d1100.26 >> 201522015-2a1150.17 >> 201522015-2b1160.17 >> 201522015-2c1180.17 >> 201522015-2d2200.32 >> 201522015-2e1100.16 >> 201532015-3a990.24 >> 201532015-3b980.24 >> 201532015-3c1050.26 >> 201532015-3d1090.27 >> 201612016-1a980.26 >> 201612016-1b780.21 >> 201612016-1c1000.27 >> 201612016-1d1010.27 >> 201622016-2a1100.19 >> 201622016-2b1120.20 >> 201622016-2c1150.20 >> 201622016-2d1180.21 >> 201622016-2e1190.21 >> Imagino una forma "larga" de hacerlo, que sería aprox: >> c <- datos[ , .(SumPorGrupo=sum(Valores)), by= .(MesAño)] >> datos$enRv <- datos$Valores/c$SumPorGrupo[which(c == datos$MesAño)] >> Pero como era de esperarse, no funciona :( >> Entonces, podría resolverlo usando SQL: >> datos$enRv <- sqldf("SELECT Valores/SumPorGrupo AS EnR FROM datosINNER >> JOIN c ON datos.MesAño = c.MesAño") >> Y ahí sí. Pero me parece que debe haber una función que lo haga >> directamente sobre el data.frame, ¿no? >> >> Luego, quisiera una forma "extendida", donde el resultado sea para las >> clases que definen dos variables (en el ejemplo, datos$Mes y datos$Año >> por separado). >> Para mi, si funcionara iría por: >> c <- datos[ , .SumPorGrupo=(sum(Valores)), by= .(Año, Mes)] >> datos$enRv <- datos$Valores/c$SumPorGrupo[which(c == c(datos$Año, >> datos$mes)] >> >> De manera similar, ¿es posible usar cumsum(datos$Valores) también por >> grupos? >> >> Espero que se entiendan las consultas. >> Adjunto el ejemplo. >> Muchas gracias!! >> -- >> Mauricio >> >> >> _______________________________________________ >> R-help-es mailing list >> R-help-es en r-project.org >> https://stat.ethz.ch/mailman/listinfo/r-help-es >> >> > -- > Forest Engineer > Master in Environmental and Natural Resource Economics > Ph.D. student in Sciences of Natural Resources at La Frontera University > Member in AguaDeTemu2030, citizen movement for Temuco with green city > standards for living > > Nota: Las tildes se han omitido para asegurar compatibilidad con algunos > lectores de correo. >-- Mauricio [[alternative HTML version deleted]]
Hola, Puedes hacerlo en dos pasos... #--------------------------- DT[ , SumValores := sum(Valores), by = "AñoMes"] DT[ , Porcen := Valores/SumValores]> head(DT)Año Mes AñoMes Factor Valores enR SumValores Porcen 1: 2015 1 2015-1 a 105 0.25 428 0.2453271 2: 2015 1 2015-1 b 104 0.24 428 0.2429907 3: 2015 1 2015-1 c 109 0.25 428 0.2546729 4: 2015 1 2015-1 d 110 0.26 428 0.2570093 #----------------------------- Saludos, Carlos Ortega www.qualityexcellence.es El 18 de agosto de 2016, 22:29, Mauricio Monsalvo <m.monsalvo en gmail.com> escribió:> Hola Eric. > Muchas gracias por tu respuesta. > Intenté hacer lo mismo sobre una variable agregada a datos, de modo: > datos$p_Valores <- datos[, Valores/sum(Valores), by=MesAño] > pero no funciona, porque pega un data.table en una única variable: > In `[<-.data.table`(x, j = name, value = value) : > Supplied 2 items to be assigned to 5849 items of column 'pValores' > (recycled leaving remainder of 1 items). > El cálculo es correcto, pero si: > head(datos) > #Solo copio y pego la columna de interés: > pValores > 1: 2011-1,2011-1,2011-1,2011-1,2011-1,2011-1, > 2: 0.17677003,0.08411600,0.06379952,0.05113864,0.04911275,0.04214248, > 3: 2011-1,2011-1,2011-1,2011-1,2011-1,2011-1, > 4: 0.17677003,0.08411600,0.06379952,0.05113864,0.04911275,0.04214248, > 5: 2011-1,2011-1,2011-1,2011-1,2011-1,2011-1, > 6: 0.17677003,0.08411600,0.06379952,0.05113864,0.04911275,0.04214248, > Luego, puedo crear un objeto, tal como vos hacés, y luego darle pegar la > segunda variable, que es la que contiene mis datos de interés. Pero sigue > siendo una forma larga... debo crear, estimar y pegar (y siempre me da > "miedo" pegar).- Por eso consultaba por una función que lo hiciera. > Saludos!! > > > El 17 de agosto de 2016, 14:47, eric <ericconchamunoz en gmail.com> escribió: > > > Para calculos sobre data.frame agrupando por niveles de una variable la > > libreria data.table va muy bien: > > > > > install.packages(data.table) > > > library(data.table) > > > > x ejemplo, con tu data.frame podrias calcular: > > > > tmp <- read.csv("datos.csv", header=TRUE) > > tmp <- as.data.table(tmp) > > tmp[, mean(Valores), by=Mes] > > > > Mes V1 > > 1: 1 100.625 > > 2: 2 125.300 > > 3: 3 102.750 > > > > > > o por año > > > > tmp[, mean(Valores), by=Agno] > > Agno V1 > > 1: 2015 116.7692 > > 2: 2016 105.6667 > > > > > > la expresion mean(Valores) la puedes cambiar por el calculo que tu > > necesitas hacer. > > > > al leer el archivo tuve problemas con la Ñ, asi es que la cambie. > > > > Saludos, > > > > eric. > > > > > > > > > > > > > > On 08/17/2016 11:31 AM, Mauricio Monsalvo wrote: > > > >> Hola. > >> Necesito calcular los porcentajes de un valor dado (valores) como > >> porcentaje de la suma de ese mismo valor pero agrupando por una tercera > >> columna (en este caso, podría ser Mes-Año). El resultado sería el que se > >> ve en la var: "EnR" > >> Necesito además que ese resultado quede pegado en mi data.frame. > >> AñoMesAñoMesFactorValoresenR > >> 201512015-1a1050.25 > >> 201512015-1b1040.24 > >> 201512015-1c1090.25 > >> 201512015-1d1100.26 > >> 201522015-2a1150.17 > >> 201522015-2b1160.17 > >> 201522015-2c1180.17 > >> 201522015-2d2200.32 > >> 201522015-2e1100.16 > >> 201532015-3a990.24 > >> 201532015-3b980.24 > >> 201532015-3c1050.26 > >> 201532015-3d1090.27 > >> 201612016-1a980.26 > >> 201612016-1b780.21 > >> 201612016-1c1000.27 > >> 201612016-1d1010.27 > >> 201622016-2a1100.19 > >> 201622016-2b1120.20 > >> 201622016-2c1150.20 > >> 201622016-2d1180.21 > >> 201622016-2e1190.21 > >> Imagino una forma "larga" de hacerlo, que sería aprox: > >> c <- datos[ , .(SumPorGrupo=sum(Valores)), by= .(MesAño)] > >> datos$enRv <- datos$Valores/c$SumPorGrupo[which(c == datos$MesAño)] > >> Pero como era de esperarse, no funciona :( > >> Entonces, podría resolverlo usando SQL: > >> datos$enRv <- sqldf("SELECT Valores/SumPorGrupo AS EnR FROM datosINNER > >> JOIN c ON datos.MesAño = c.MesAño") > >> Y ahí sí. Pero me parece que debe haber una función que lo haga > >> directamente sobre el data.frame, ¿no? > >> > >> Luego, quisiera una forma "extendida", donde el resultado sea para las > >> clases que definen dos variables (en el ejemplo, datos$Mes y datos$Año > >> por separado). > >> Para mi, si funcionara iría por: > >> c <- datos[ , .SumPorGrupo=(sum(Valores)), by= .(Año, Mes)] > >> datos$enRv <- datos$Valores/c$SumPorGrupo[which(c == c(datos$Año, > >> datos$mes)] > >> > >> De manera similar, ¿es posible usar cumsum(datos$Valores) también por > >> grupos? > >> > >> Espero que se entiendan las consultas. > >> Adjunto el ejemplo. > >> Muchas gracias!! > >> -- > >> Mauricio > >> > >> > >> _______________________________________________ > >> R-help-es mailing list > >> R-help-es en r-project.org > >> https://stat.ethz.ch/mailman/listinfo/r-help-es > >> > >> > > -- > > Forest Engineer > > Master in Environmental and Natural Resource Economics > > Ph.D. student in Sciences of Natural Resources at La Frontera University > > Member in AguaDeTemu2030, citizen movement for Temuco with green city > > standards for living > > > > Nota: Las tildes se han omitido para asegurar compatibilidad con algunos > > lectores de correo. > > > > > > -- > Mauricio > > [[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. Muchas gracias! El 18 de agosto de 2016, 20:03, Carlos Ortega <cof en qualityexcellence.es> escribió:> Hola, > > Puedes hacerlo en dos pasos... > > #--------------------------- > DT[ , SumValores := sum(Valores), by = "AñoMes"] > DT[ , Porcen := Valores/SumValores] > > head(DT) > Año Mes AñoMes Factor Valores enR SumValores Porcen > 1: 2015 1 2015-1 a 105 0.25 428 0.2453271 > 2: 2015 1 2015-1 b 104 0.24 428 0.2429907 > 3: 2015 1 2015-1 c 109 0.25 428 0.2546729 > 4: 2015 1 2015-1 d 110 0.26 428 0.2570093 > > #----------------------------- > > Saludos, > Carlos Ortega > www.qualityexcellence.es > > > El 18 de agosto de 2016, 22:29, Mauricio Monsalvo <m.monsalvo en gmail.com> > escribió: > >> Hola Eric. >> Muchas gracias por tu respuesta. >> Intenté hacer lo mismo sobre una variable agregada a datos, de modo: >> datos$p_Valores <- datos[, Valores/sum(Valores), by=MesAño] >> pero no funciona, porque pega un data.table en una única variable: >> In `[<-.data.table`(x, j = name, value = value) : >> Supplied 2 items to be assigned to 5849 items of column 'pValores' >> (recycled leaving remainder of 1 items). >> El cálculo es correcto, pero si: >> head(datos) >> #Solo copio y pego la columna de interés: >> pValores >> 1: 2011-1,2011-1,2011-1,2011-1,2011-1,2011-1, >> 2: 0.17677003,0.08411600,0.06379952,0.05113864,0.04911275,0.04214248, >> 3: 2011-1,2011-1,2011-1,2011-1,2011-1,2011-1, >> 4: 0.17677003,0.08411600,0.06379952,0.05113864,0.04911275,0.04214248, >> 5: 2011-1,2011-1,2011-1,2011-1,2011-1,2011-1, >> 6: 0.17677003,0.08411600,0.06379952,0.05113864,0.04911275,0.04214248, >> Luego, puedo crear un objeto, tal como vos hacés, y luego darle pegar la >> segunda variable, que es la que contiene mis datos de interés. Pero sigue >> siendo una forma larga... debo crear, estimar y pegar (y siempre me da >> "miedo" pegar).- Por eso consultaba por una función que lo hiciera. >> Saludos!! >> >> >> El 17 de agosto de 2016, 14:47, eric <ericconchamunoz en gmail.com> >> escribió: >> >> > Para calculos sobre data.frame agrupando por niveles de una variable la >> > libreria data.table va muy bien: >> > >> > > install.packages(data.table) >> > > library(data.table) >> > >> > x ejemplo, con tu data.frame podrias calcular: >> > >> > tmp <- read.csv("datos.csv", header=TRUE) >> > tmp <- as.data.table(tmp) >> > tmp[, mean(Valores), by=Mes] >> > >> > Mes V1 >> > 1: 1 100.625 >> > 2: 2 125.300 >> > 3: 3 102.750 >> > >> > >> > o por año >> > >> > tmp[, mean(Valores), by=Agno] >> > Agno V1 >> > 1: 2015 116.7692 >> > 2: 2016 105.6667 >> > >> > >> > la expresion mean(Valores) la puedes cambiar por el calculo que tu >> > necesitas hacer. >> > >> > al leer el archivo tuve problemas con la Ñ, asi es que la cambie. >> > >> > Saludos, >> > >> > eric. >> > >> > >> > >> > >> > >> > >> > On 08/17/2016 11:31 AM, Mauricio Monsalvo wrote: >> > >> >> Hola. >> >> Necesito calcular los porcentajes de un valor dado (valores) como >> >> porcentaje de la suma de ese mismo valor pero agrupando por una tercera >> >> columna (en este caso, podría ser Mes-Año). El resultado sería el que >> se >> >> ve en la var: "EnR" >> >> Necesito además que ese resultado quede pegado en mi data.frame. >> >> AñoMesAñoMesFactorValoresenR >> >> 201512015-1a1050.25 >> >> 201512015-1b1040.24 >> >> 201512015-1c1090.25 >> >> 201512015-1d1100.26 >> >> 201522015-2a1150.17 >> >> 201522015-2b1160.17 >> >> 201522015-2c1180.17 >> >> 201522015-2d2200.32 >> >> 201522015-2e1100.16 >> >> 201532015-3a990.24 >> >> 201532015-3b980.24 >> >> 201532015-3c1050.26 >> >> 201532015-3d1090.27 >> >> 201612016-1a980.26 >> >> 201612016-1b780.21 >> >> 201612016-1c1000.27 >> >> 201612016-1d1010.27 >> >> 201622016-2a1100.19 >> >> 201622016-2b1120.20 >> >> 201622016-2c1150.20 >> >> 201622016-2d1180.21 >> >> 201622016-2e1190.21 >> >> Imagino una forma "larga" de hacerlo, que sería aprox: >> >> c <- datos[ , .(SumPorGrupo=sum(Valores)), by= .(MesAño)] >> >> datos$enRv <- datos$Valores/c$SumPorGrupo[which(c == datos$MesAño)] >> >> Pero como era de esperarse, no funciona :( >> >> Entonces, podría resolverlo usando SQL: >> >> datos$enRv <- sqldf("SELECT Valores/SumPorGrupo AS EnR FROM datosINNER >> >> JOIN c ON datos.MesAño = c.MesAño") >> >> Y ahí sí. Pero me parece que debe haber una función que lo haga >> >> directamente sobre el data.frame, ¿no? >> >> >> >> Luego, quisiera una forma "extendida", donde el resultado sea para las >> >> clases que definen dos variables (en el ejemplo, datos$Mes y datos$Año >> >> por separado). >> >> Para mi, si funcionara iría por: >> >> c <- datos[ , .SumPorGrupo=(sum(Valores)), by= .(Año, Mes)] >> >> datos$enRv <- datos$Valores/c$SumPorGrupo[which(c == c(datos$Año, >> >> datos$mes)] >> >> >> >> De manera similar, ¿es posible usar cumsum(datos$Valores) también por >> >> grupos? >> >> >> >> Espero que se entiendan las consultas. >> >> Adjunto el ejemplo. >> >> Muchas gracias!! >> >> -- >> >> Mauricio >> >> >> >> >> >> _______________________________________________ >> >> R-help-es mailing list >> >> R-help-es en r-project.org >> >> https://stat.ethz.ch/mailman/listinfo/r-help-es >> >> >> >> >> > -- >> > Forest Engineer >> > Master in Environmental and Natural Resource Economics >> > Ph.D. student in Sciences of Natural Resources at La Frontera University >> > Member in AguaDeTemu2030, citizen movement for Temuco with green city >> > standards for living >> > >> > Nota: Las tildes se han omitido para asegurar compatibilidad con algunos >> > lectores de correo. >> > >> >> >> >> -- >> Mauricio >> >> [[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 >-- Mauricio [[alternative HTML version deleted]]