<div dir="ltr"><div class="gmail_default" style="font-family:tahoma,sans-serif">Hola.</div><div class="gmail_default" style="font-family:tahoma,sans-serif">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"</div><div class="gmail_default" style="font-family:tahoma,sans-serif">Necesito además que ese resultado quede pegado en mi data.frame. </div><div class="gmail_default" style="font-family:tahoma,sans-serif"><span style="font-family:monospace,monospace">Año</span><span class="" style="font-family:monospace,monospace;white-space:pre"> </span><span style="font-family:monospace,monospace">Mes</span><span class="" style="font-family:monospace,monospace;white-space:pre"> </span><span style="font-family:monospace,monospace">AñoMes</span><span class="" style="font-family:monospace,monospace;white-space:pre"> </span><span style="font-family:monospace,monospace">Factor</span><span class="" style="font-family:monospace,monospace;white-space:pre"> </span><span style="font-family:monospace,monospace">Valores</span><span class="" style="font-family:monospace,monospace;white-space:pre"> </span><span style="font-family:monospace,monospace">enR</span><br></div><div class="gmail_default" style=""><div class="gmail_default" style=""><font face="monospace, monospace">2015<span class="" style="white-space:pre"> </span>1<span class="" style="white-space:pre"> </span>2015-1<span class="" style="white-space:pre"> </span>a<span class="" style="white-space:pre"> </span>105<span class="" style="white-space:pre"> </span>0.25</font></div><div class="gmail_default" style=""><font face="monospace, monospace">2015<span class="" style="white-space:pre"> </span>1<span class="" style="white-space:pre"> </span>2015-1<span class="" style="white-space:pre"> </span>b<span class="" style="white-space:pre"> </span>104<span class="" style="white-space:pre"> </span>0.24</font></div><div class="gmail_default" style=""><font face="monospace, monospace">2015<span class="" style="white-space:pre"> </span>1<span class="" style="white-space:pre"> </span>2015-1<span class="" style="white-space:pre"> </span>c<span class="" style="white-space:pre"> </span>109<span class="" style="white-space:pre"> </span>0.25</font></div><div class="gmail_default" style=""><font face="monospace, monospace">2015<span class="" style="white-space:pre"> </span>1<span class="" style="white-space:pre"> </span>2015-1<span class="" style="white-space:pre"> </span>d<span class="" style="white-space:pre"> </span>110<span class="" style="white-space:pre"> </span>0.26</font></div><div class="gmail_default" style=""><font face="monospace, monospace">2015<span class="" style="white-space:pre"> </span>2<span class="" style="white-space:pre"> </span>2015-2<span class="" style="white-space:pre"> </span>a<span class="" style="white-space:pre"> </span>115<span class="" style="white-space:pre"> </span>0.17</font></div><div class="gmail_default" style=""><font face="monospace, monospace">2015<span class="" style="white-space:pre"> </span>2<span class="" style="white-space:pre"> </span>2015-2<span class="" style="white-space:pre"> </span>b<span class="" style="white-space:pre"> </span>116<span class="" style="white-space:pre"> </span>0.17</font></div><div class="gmail_default" style=""><font face="monospace, monospace">2015<span class="" style="white-space:pre"> </span>2<span class="" style="white-space:pre"> </span>2015-2<span class="" style="white-space:pre"> </span>c<span class="" style="white-space:pre"> </span>118<span class="" style="white-space:pre"> </span>0.17</font></div><div class="gmail_default" style=""><font face="monospace, monospace">2015<span class="" style="white-space:pre"> </span>2<span class="" style="white-space:pre"> </span>2015-2<span class="" style="white-space:pre"> </span>d<span class="" style="white-space:pre"> </span>220<span class="" style="white-space:pre"> </span>0.32</font></div><div class="gmail_default" style=""><font face="monospace, monospace">2015<span class="" style="white-space:pre"> </span>2<span class="" style="white-space:pre"> </span>2015-2<span class="" style="white-space:pre"> </span>e<span class="" style="white-space:pre"> </span>110<span class="" style="white-space:pre"> </span>0.16</font></div><div class="gmail_default" style=""><font face="monospace, monospace">2015<span class="" style="white-space:pre"> </span>3<span class="" style="white-space:pre"> </span>2015-3<span class="" style="white-space:pre"> </span>a<span class="" style="white-space:pre"> </span>99<span class="" style="white-space:pre"> </span>0.24</font></div><div class="gmail_default" style=""><font face="monospace, monospace">2015<span class="" style="white-space:pre"> </span>3<span class="" style="white-space:pre"> </span>2015-3<span class="" style="white-space:pre"> </span>b<span class="" style="white-space:pre"> </span>98<span class="" style="white-space:pre"> </span>0.24</font></div><div class="gmail_default" style=""><font face="monospace, monospace">2015<span class="" style="white-space:pre"> </span>3<span class="" style="white-space:pre"> </span>2015-3<span class="" style="white-space:pre"> </span>c<span class="" style="white-space:pre"> </span>105<span class="" style="white-space:pre"> </span>0.26</font></div><div class="gmail_default" style=""><font face="monospace, monospace">2015<span class="" style="white-space:pre"> </span>3<span class="" style="white-space:pre"> </span>2015-3<span class="" style="white-space:pre"> </span>d<span class="" style="white-space:pre"> </span>109<span class="" style="white-space:pre"> </span>0.27</font></div><div class="gmail_default" style=""><font face="monospace, monospace">2016<span class="" style="white-space:pre"> </span>1<span class="" style="white-space:pre"> </span>2016-1<span class="" style="white-space:pre"> </span>a<span class="" style="white-space:pre"> </span>98<span class="" style="white-space:pre"> </span>0.26</font></div><div class="gmail_default" style=""><font face="monospace, monospace">2016<span class="" style="white-space:pre"> </span>1<span class="" style="white-space:pre"> </span>2016-1<span class="" style="white-space:pre"> </span>b<span class="" style="white-space:pre"> </span>78<span class="" style="white-space:pre"> </span>0.21</font></div><div class="gmail_default" style=""><font face="monospace, monospace">2016<span class="" style="white-space:pre"> </span>1<span class="" style="white-space:pre"> </span>2016-1<span class="" style="white-space:pre"> </span>c<span class="" style="white-space:pre"> </span>100<span class="" style="white-space:pre"> </span>0.27</font></div><div class="gmail_default" style=""><font face="monospace, monospace">2016<span class="" style="white-space:pre"> </span>1<span class="" style="white-space:pre"> </span>2016-1<span class="" style="white-space:pre"> </span>d<span class="" style="white-space:pre"> </span>101<span class="" style="white-space:pre"> </span>0.27</font></div><div class="gmail_default" style=""><font face="monospace, monospace">2016<span class="" style="white-space:pre"> </span>2<span class="" style="white-space:pre"> </span>2016-2<span class="" style="white-space:pre"> </span>a<span class="" style="white-space:pre"> </span>110<span class="" style="white-space:pre"> </span>0.19</font></div><div class="gmail_default" style=""><font face="monospace, monospace">2016<span class="" style="white-space:pre"> </span>2<span class="" style="white-space:pre"> </span>2016-2<span class="" style="white-space:pre"> </span>b<span class="" style="white-space:pre"> </span>112<span class="" style="white-space:pre"> </span>0.20</font></div><div class="gmail_default" style=""><font face="monospace, monospace">2016<span class="" style="white-space:pre"> </span>2<span class="" style="white-space:pre"> </span>2016-2<span class="" style="white-space:pre"> </span>c<span class="" style="white-space:pre"> </span>115<span class="" style="white-space:pre"> </span>0.20</font></div><div class="gmail_default" style=""><font face="monospace, monospace">2016<span class="" style="white-space:pre"> </span>2<span class="" style="white-space:pre"> </span>2016-2<span class="" style="white-space:pre"> </span>d<span class="" style="white-space:pre"> </span>118<span class="" style="white-space:pre"> </span>0.21</font></div><div class="gmail_default" style=""><font face="monospace, monospace">2016<span class="" style="white-space:pre"> </span>2<span class="" style="white-space:pre"> </span>2016-2<span class="" style="white-space:pre"> </span>e<span class="" style="white-space:pre"> </span>119<span class="" style="white-space:pre"> </span>0.21</font></div><div style="font-family:tahoma,sans-serif">Imagino una forma "larga" de hacerlo, que sería aprox:<br></div></div><div><div class="gmail_default" style=""><div class="gmail_default" style=""><div class="gmail_default" style=""><font face="tahoma, sans-serif">c <- datos[ , .(SumPorGrupo=sum(Valores)), by= .(MesAño)]</font></div><div class="gmail_default" style=""><font face="tahoma, sans-serif">datos$enRv <- datos$Valores/c$SumPorGrupo[which(c == datos$MesAño)]</font></div><div class="gmail_default" style=""><font face="tahoma, sans-serif">Pero como era de esperarse, no funciona :( </font></div><div class="gmail_default" style=""><font face="tahoma, sans-serif">Entonces, podría resolverlo usando SQL:</font></div><div class="gmail_default" style=""><font face="tahoma, sans-serif"><div class="gmail_default">datos$enRv <- sqldf("SELECT Valores/SumPorGrupo AS EnR FROM datosINNER JOIN c ON datos.MesAño = c.MesAño") </div><div class="gmail_default">Y ahí sí. Pero me parece que debe haber una función que lo haga directamente sobre el data.frame, ¿no? </div><div class="gmail_default"><br></div></font></div><div class="gmail_default" style=""><font face="tahoma, sans-serif">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). </font></div><div class="gmail_default" style=""><font face="tahoma, sans-serif">Para mi, si funcionara iría por:</font></div><div class="gmail_default" style=""><font face="tahoma, sans-serif">c <- datos[ , .SumPorGrupo=(sum(Valores)), by= .(Año, Mes)]</font></div><div class="gmail_default" style=""><font face="tahoma, sans-serif">datos$enRv <- datos$Valores/c$SumPorGrupo[which(c == c(datos$Año, datos$mes)]</font></div><div class="gmail_default" style=""><font face="tahoma, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="tahoma, sans-serif">De manera similar, ¿es posible usar cumsum(datos$Valores) también por grupos?</font></div><div class="gmail_default" style=""><font face="tahoma, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="tahoma, sans-serif">Espero que se entiendan las consultas.</font></div><div class="gmail_default" style=""><span style="font-family:tahoma,sans-serif">Adjunto el ejemplo.</span><br></div><div class="gmail_default" style="">Muchas gracias!!</div><div class="gmail_default" style="">-- <br></div></div></div></div><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><font face="tahoma, sans-serif">Mauricio</font></div></div>
</div>