[R-es] Porcentajes por grupos

eric ericconchamunoz en gmail.com
Mie Ago 17 19:47:03 CEST 2016


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.



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