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