[R-es] comportamiento de data.table al hacer calculos por grupos

Carlos Ortega cof en qualityexcellence.es
Vie Mayo 15 01:28:07 CEST 2015


Hola,

La forma de hacerlo con data.table es esta:

> library(data.table)
> datIn <- fread("zp.res")
> med <- datIn[, .(vmed=mean(media)), by=.(sol,dia,con)]
> head(med)
   sol dia con   vmed
1: con   1   0 -29.37
2: dec   1   1 -30.35
3: dec   1   3 -37.15
4: dec   1   5 -31.55
5: dol   1   1 -24.02
6: dol   1   3 -32.95


   - La solución que has empleado actualiza el valor de una columna. Y
   aunque te calcula el valor medio por grupo, lo adjunta al data.table
   original.
   - En cambio esta otra forma se calcula únicamente el valor medio por
   grupo.

Y bueno si quieres ordenar para que salga el mismo orden que en sqldf,
puedes hacer esto otro:

> setorder(med, sol, dia)
> head(med)
   sol dia con   vmed
1: con   1   0 -29.37
2: con   2   0 -31.65
3: con   3   0 -28.25
4: con   4   0 -26.17
5: con   5   0 -27.94
6: con   6   0 -28.68


Saludos,
Carlos Ortega
www.qualiytexcellence.es

El 15 de mayo de 2015, 1:00, eric <ericconchamunoz en gmail.com> escribió:

> Estimada comunidad tengo un problema del que no encuentro datos que me
> ayuden mucho en la web.
>
> Estoy haciendo calculos por grupos con data,table. Tengo un archivo
> (zp.res) con tres columnas que clasifican los datos (sol, con, dia)  y una
> columna de datos numericos (media), de la siguiente forma:
>
>      sol con dia media
>   1: con   0   1 -22.6
>   2: con   0   1 -36.6
>   3: con   0   1 -35.6
>
> y quiero calcular el promedio de "media" (la col 4) agrupando con las
> variables sol,con,dia. Lo hago de la siguiente forma:
>
> med <- zp.res[, mean(media), by="sol,dia,con"]
>
> cuando reviso "med" esta todo bien, se han calculado las medias y el
> objeto tiene solo las filas que corresponden a los promedios con sus
> respectivas columnas sol,con,dia que los identifican. Pero como notaran por
> el codigo, la columna con el resultado no tiene un nombre asi es que R la
> bautiza como V1. Quise ponele un nombre y agregue este al codigo de la
> siguiente forma:
>
> med <- zp.res[, "ave":=mean(media), by="sol,dia,con"]
>
> el problema es que ahora el objeto med tiene el mismo numero de filas que
> zp.res y repite el promedio para cada dato dentro del grupo obtenido con
> by="sol,dia,con". Esto no me sirve pues tengo que graficar los promedios ...
>
> mmmmm puede que mi explicacion sea algo confusa, espero que me entiendan.
>
> Encontre que luego puedo renombrar la columna, pero no lo quiero hacer,
> pues pienso que deberia ser estandar poder ponerle el nombre y que se
> construya bien el objeto con los promedios inmediatamente. Ademas el
> promedio es solo uno de los calculos que debo hacer y los otros tambien
> quedan con el nombre V1 en la mismo data.table.
>
> Alguna idea de como hacerlo ?
>
> Adjunto archivo con datos.
>
> Saludos y gracias, eric.
>
>
>
>
>
> --
> 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.
>
> _______________________________________________
> 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