[R-es] Porcentajes por grupos

Carlos Ortega cof en qualityexcellence.es
Vie Ago 19 01:03:25 CEST 2016


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]]



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