Rubén Gómez Antolí
2012-May-17  23:27 UTC
[R-es] Agrupación de valores de variable definida en fila y objeto temporal
Hola:
Os consulto dos cosas porque llevo unos días bastante espeso y no soy 
capaz de sacarlo, seguro que es muy fácil, pero no doy con ello.
Estoy analizando unas facturas de gastos telefónicos y parto de un 
data.frame de esta forma:
DB.telefonos<-data.frame(
   Empresa=c(rep("Empr.1",3),rep("Empr.2",3)),
   Numero=c(rep(666666666,3),rep(666666667,3)),
   Extension=c(rep(2001,3),rep(2002,3)),
   Mes=c(rep(c("Marzo","Febrero","Enero"),2)),
   Concepto=c(rep(c("Fijos","Móviles","Móv. otra
comp."),2)),
   Duracion=c("05:32:00","132:28:00",
	"98:65:00","78:32:00","21:09:00","11:11:00"),
   Coste=c(10.82,13.56,67.32,9.76,17.23,79.18),
   Descuento=c(0.0,0.6,0.6,0.0,0.6,0.6)
)
Lo que quiero es obtener gráficos y tablas con resúmenes de duraciones 
totales por tipo de llamada, por línea, por mes... vamos, lo usual.
El primer problema es que soy incapaz de crear subtablas a partir de las 
variables que me interesen de una forma fácil.
Lo he conseguido de esta forma:
Tipos.llamadas.1<-levels(DB.telefonos$Concepto)[c(2,3)]
aux1<-sapply(Tipos.llamada.1,
    function (x) which(DB.telefonos$Concepto == x))
aux1<-sort(as.integer(unlist(aux1)))
Duracion.llamadas.moviles<-DB.telefonos[c(aux1),c(1:4,6)]
Estoy casi seguro de la existencia de una forma más directa y sencilla 
de conseguir lo mismo, pero me sigo sin aclarar con stack, aggregate y 
demás parientes como melt y cast del paquete Reshape.
Segundo problema: la duración. Si os habéis fijado viene de esta forma 
00:00:00, que viene a significar MM:SS:MsMs. (El campo de los MsMs es 
obra y gracia de la hoja de cálculo de Libreoffice, he sido incapaz de 
dejar solo los MM:SS, por eso están siempre a cero.)
Como lo que quiero trabajar son tiempos, lo lógico es pasarlo a un 
objeto de ese tipo. He repasado la clase Zoo, el paquete Chron, 
Lubridate y otros sin atinar en como hacerlo.
Como ya digo estoy bastante espeso estos últimos días así que si alguno 
tiene a bien señalarme la Luna... (intentaré mirar la Luna y no el dedo)
Gracias por adelantado.
Salud y Revolución.
Lobo.
-- 
Libertad es poder elegir en cualquier momento. Ahora yo elijo GNU/Linux,
para no atar mis manos con las cadenas del soft propietario.
---------
Desde El Ejido, en Almería, usuario registrado Linux #294013
http://www.counter.li.org
Jorge I Velez
2012-May-17  23:53 UTC
[R-es] Agrupación de valores de variable definida en fila y objeto temporal
Hola Lobo,
Lo siguiente podria ayudarte:
 # datos
DB.telefonos <- structure(list(Empresa = structure(c(1L, 1L, 1L, 2L, 2L,
2L), .Label = c("Empr.1", "Empr.2"), class =
"factor"), Numero c(666666666, 666666666,
666666666, 666666667, 666666667, 666666667), Extension = c(2001, 2001,
2001, 2002, 2002, 2002), Mes = structure(c(3L, 2L, 1L, 3L, 2L, 1L), .Label
= c("Enero", "Febrero", "Marzo"), class =
"factor"), Concepto structure(c(1L, 3L, 2L, 1L, 3L, 2L), .Label =
c("Fijos",
    "Móv. otra comp.", "Móviles"), class =
"factor"), Duracion structure(c(1L,
    3L, 6L, 5L, 4L, 2L), .Label = c("05:32:00", "11:11:00",
"132:28:00",
    "21:09:00", "78:32:00", "98:65:00"), class =
"factor"), Coste c(10.82,
    13.56, 67.32, 9.76, 17.23, 79.18), Descuento = c(0, 0.6,
    0.6, 0, 0.6, 0.6)), .Names = c("Empresa", "Numero",
"Extension",
"Mes", "Concepto", "Duracion", "Coste",
"Descuento"), row.names = c(NA,
-6L), class = "data.frame")
# funcion para convertir la duracion a segundos
# asumiendo que x:y:z significa x minutos, y segundos y z ms
segundos <- function(x){
    x <- as.numeric(x)
  sum(as.numeric(x)[1:2]*60^c(1, 0)) + x[3]/1000
}
# conviertiendo la duracion de x:y:z a segundos
DB.telefonos$Duracion <-
sapply(strsplit(as.character(DB.telefonos$Duracion), ''[:]''),
segundos)
DB.telefonos$Duracion
# total por empresa
with(DB.telefonos, tapply(Duracion, list(Empresa), sum))
# total por mes
with(DB.telefonos, tapply(Duracion, list(Empresa, Mes), sum))
# total por empresa/mes
with(DB.telefonos, tapply(Duracion, list(Empresa, Mes), sum))
with(DB.telefonos, aggregate(Duracion, list(Empresa, Mes), sum))
# total por empresa/concepto
with(DB.telefonos, aggregate(Duracion, list(Empresa, Concepto), sum))
Para ayuda con mas calculos mira ?tapply, ?aggregate, ?ave y la libreria
plyr.  Los graficos podrias obtenerlos con ?barplot, ?plot, ?coplot y las
alternativas en lattice o ggplot2.
Saludos,
Jorge.-
2012/5/17 Rubén Gómez Antolí <>
> Hola:
>
> Os consulto dos cosas porque llevo unos días bastante espeso y no soy
> capaz de sacarlo, seguro que es muy fácil, pero no doy con ello.
>
> Estoy analizando unas facturas de gastos telefónicos y parto de un
> data.frame de esta forma:
>
> DB.telefonos<-data.frame(
>  Empresa=c(rep("Empr.1",3),rep(**"Empr.2",3)),
>  Numero=c(rep(666666666,3),rep(**666666667,3)),
>  Extension=c(rep(2001,3),rep(**2002,3)),
> 
Mes=c(rep(c("Marzo","Febrero",**"Enero"),2)),
>  Concepto=c(rep(c("Fijos","**Móviles","Móv. otra
comp."),2)),
>  Duracion=c("05:32:00","132:28:**00",
>       
"98:65:00","78:32:00","21:09:**00","11:11:00"),
>  Coste=c(10.82,13.56,67.32,9.**76,17.23,79.18),
>  Descuento=c(0.0,0.6,0.6,0.0,0.**6,0.6)
> )
>
> Lo que quiero es obtener gráficos y tablas con resúmenes de duraciones
> totales por tipo de llamada, por línea, por mes... vamos, lo usual.
>
> El primer problema es que soy incapaz de crear subtablas a partir de las
> variables que me interesen de una forma fácil.
>
> Lo he conseguido de esta forma:
>
> Tipos.llamadas.1<-levels(DB.**telefonos$Concepto)[c(2,3)]
>
> aux1<-sapply(Tipos.llamada.1,
>   function (x) which(DB.telefonos$Concepto == x))
>
> aux1<-sort(as.integer(unlist(**aux1)))
>
> Duracion.llamadas.moviles<-DB.**telefonos[c(aux1),c(1:4,6)]
>
> Estoy casi seguro de la existencia de una forma más directa y sencilla de
> conseguir lo mismo, pero me sigo sin aclarar con stack, aggregate y demás
> parientes como melt y cast del paquete Reshape.
>
> Segundo problema: la duración. Si os habéis fijado viene de esta forma
> 00:00:00, que viene a significar MM:SS:MsMs. (El campo de los MsMs es obra
> y gracia de la hoja de cálculo de Libreoffice, he sido incapaz de dejar
> solo los MM:SS, por eso están siempre a cero.)
>
> Como lo que quiero trabajar son tiempos, lo lógico es pasarlo a un objeto
> de ese tipo. He repasado la clase Zoo, el paquete Chron, Lubridate y otros
> sin atinar en como hacerlo.
>
> Como ya digo estoy bastante espeso estos últimos días así que si alguno
> tiene a bien señalarme la Luna... (intentaré mirar la Luna y no el dedo)
>
> Gracias por adelantado.
>
> Salud y Revolución.
>
> Lobo.
> --
> Libertad es poder elegir en cualquier momento. Ahora yo elijo GNU/Linux,
> para no atar mis manos con las cadenas del soft propietario.
> ---------
> Desde El Ejido, en Almería, usuario registrado Linux #294013
> http://www.counter.li.org
>
> ______________________________**_________________
> R-help-es mailing list
> R-help-es@r-project.org
>
https://stat.ethz.ch/mailman/**listinfo/r-help-es<https://stat.ethz.ch/mailman/listinfo/r-help-es>
>
	[[alternative HTML version deleted]]
Carlos Ortega
2012-May-18  10:14 UTC
[R-es] Agrupación de valores de variable definida en fila y objeto temporal
Hola,
Por si te interesa una alternativa adicional:
library(lubridate)
library(sqldf)
DF<-DB.telefonos
DF$DursecN<-seconds(as.duration(hms(DF$Duracion)))
# Tiempo y Coste Total
sqldf("select sum(DursecN) ''SumaSecs'', sum(Coste)
''Coste'' from DF ")
# Tiempo y Coste Total por Empresa
sqldf("select sum(DursecN) ''SumaSecs'', sum(Coste)
''Coste'', Empresa from DF
group by Empresa")
# Tiempo y Coste por mes
sqldf("select Mes, sum(DursecN) ''Suma-Secs'', sum(Coste)
''Coste'' from DF
group by Mes")
# Tiempo y Coste por Mes y Concepto
sqldf("select Mes, sum(DursecN) ''Suma-Secs'', sum(Coste)
''Coste'', Concepto
from DF group by Mes, Concepto")
# Tiempo y Coste por Mes y Numero
sqldf("select Mes, sum(DursecN) ''Suma-Secs'', sum(Coste)
''Coste'', Numero
 from DF group by Mes, Numero")
# Tiempo y Coste por Empresa, Mes, Numero, Concepto
sqldf("select sum(DursecN) ''Suma-Secs'', sum(Coste)
''Coste'', Empresa, Mes,
Numero, Concepto  from DF group by Empresa, Mes, Numero, Concepto")
#.....
Saludos,
Carlos Ortega
www.qualityexcellence.es
El 18 de mayo de 2012 01:27, Rubén Gómez Antolí
<lobo@mucharuina.com>escribió:
> Hola:
>
> Os consulto dos cosas porque llevo unos días bastante espeso y no soy
> capaz de sacarlo, seguro que es muy fácil, pero no doy con ello.
>
> Estoy analizando unas facturas de gastos telefónicos y parto de un
> data.frame de esta forma:
>
> DB.telefonos<-data.frame(
>  Empresa=c(rep("Empr.1",3),rep(**"Empr.2",3)),
>  Numero=c(rep(666666666,3),rep(**666666667,3)),
>  Extension=c(rep(2001,3),rep(**2002,3)),
> 
Mes=c(rep(c("Marzo","Febrero",**"Enero"),2)),
>  Concepto=c(rep(c("Fijos","**Móviles","Móv. otra
comp."),2)),
>  Duracion=c("05:32:00","132:28:**00",
>       
"98:65:00","78:32:00","21:09:**00","11:11:00"),
>  Coste=c(10.82,13.56,67.32,9.**76,17.23,79.18),
>  Descuento=c(0.0,0.6,0.6,0.0,0.**6,0.6)
> )
>
> Lo que quiero es obtener gráficos y tablas con resúmenes de duraciones
> totales por tipo de llamada, por línea, por mes... vamos, lo usual.
>
> El primer problema es que soy incapaz de crear subtablas a partir de las
> variables que me interesen de una forma fácil.
>
> Lo he conseguido de esta forma:
>
> Tipos.llamadas.1<-levels(DB.**telefonos$Concepto)[c(2,3)]
>
> aux1<-sapply(Tipos.llamada.1,
>   function (x) which(DB.telefonos$Concepto == x))
>
> aux1<-sort(as.integer(unlist(**aux1)))
>
> Duracion.llamadas.moviles<-DB.**telefonos[c(aux1),c(1:4,6)]
>
> Estoy casi seguro de la existencia de una forma más directa y sencilla de
> conseguir lo mismo, pero me sigo sin aclarar con stack, aggregate y demás
> parientes como melt y cast del paquete Reshape.
>
> Segundo problema: la duración. Si os habéis fijado viene de esta forma
> 00:00:00, que viene a significar MM:SS:MsMs. (El campo de los MsMs es obra
> y gracia de la hoja de cálculo de Libreoffice, he sido incapaz de dejar
> solo los MM:SS, por eso están siempre a cero.)
>
> Como lo que quiero trabajar son tiempos, lo lógico es pasarlo a un objeto
> de ese tipo. He repasado la clase Zoo, el paquete Chron, Lubridate y otros
> sin atinar en como hacerlo.
>
> Como ya digo estoy bastante espeso estos últimos días así que si alguno
> tiene a bien señalarme la Luna... (intentaré mirar la Luna y no el dedo)
>
> Gracias por adelantado.
>
> Salud y Revolución.
>
> Lobo.
> --
> Libertad es poder elegir en cualquier momento. Ahora yo elijo GNU/Linux,
> para no atar mis manos con las cadenas del soft propietario.
> ---------
> Desde El Ejido, en Almería, usuario registrado Linux #294013
> http://www.counter.li.org
>
> ______________________________**_________________
> R-help-es mailing list
> R-help-es@r-project.org
>
https://stat.ethz.ch/mailman/**listinfo/r-help-es<https://stat.ethz.ch/mailman/listinfo/r-help-es>
>
-- 
Saludos,
Carlos Ortega
www.qualityexcellence.es
	[[alternative HTML version deleted]]
Rubén Gómez Antolí
2012-May-22  21:47 UTC
[R-es] Agrupación de valores de variable definida en fila y objeto temporal
Hola: Estoy teniendo problemas con el correo, esto parece que no llegó. El 20/05/12 12:28, Rubén Gómez Antolí escribió:> Hola: > > Gracias Jorge y Carlos por vuestras respuestas. > > El 18/05/12 01:53, Jorge I Velez escribió: >> Hola Lobo, >> >> Lo siguiente podria ayudarte: >> >> # datos >> DB.telefonos <- structure(list(Empresa = structure(c(1L, 1L, 1L, 2L, 2L, >> 2L), .Label = c("Empr.1", "Empr.2"), class = "factor"), Numero >> c(666666666, 666666666, > > No conocía «structure», gracias por el ejemplo. > >> # funcion para convertir la duracion a segundos >> # asumiendo que x:y:z significa x minutos, y segundos y z ms >> segundos <- function(x){ >> x <- as.numeric(x) >> sum(as.numeric(x)[1:2]*60^c(1, 0)) + x[3]/1000 >> } > > Lo que es mirar las cosas con otra perspectiva. Yo estaba empeñado en > convertirlo en un objeto temporal, cuando lo más fácil es tratarlo como > un número que significa segundos, o minutos que me interesa más que > segundos. > > Me ha parecido muy interesante el detalle que tienes elevando la > multiplicación a 1 y 0. > >> [...] >> # total por empresa/mes >> with(DB.telefonos, tapply(Duracion, list(Empresa, Mes), sum)) >> with(DB.telefonos, aggregate(Duracion, list(Empresa, Mes), sum)) >> > > Perfecto, con estos ejemplos y los que comenta Carlos ya puedo terminar > la tarea. Muchísimas gracias a los dos. > >> Para ayuda con mas calculos mira ?tapply, ?aggregate, ?ave y la libreria >> plyr. Los graficos podrias obtenerlos con ?barplot, ?plot, ?coplot y >> las alternativas en lattice o ggplot2. > > Estoy intentando encontrar alguna documentación que cubra con amplitud > estos temas de modificación de datos, hasta el momento no tengo éxito. > ¿Hay algo por ahí o habrá que ir saltando de detalle en detalle en la > múltiple y variada documentación existente? > >> Saludos, >> Jorge.- > > Salud y Revolución. > > Lobo.-- Libertad es poder elegir en cualquier momento. Ahora yo elijo GNU/Linux, para no atar mis manos con las cadenas del soft propietario. --------- Desde El Ejido, en Almería, usuario registrado Linux #294013 http://www.counter.li.org
Jorge I Velez
2012-May-22  21:57 UTC
[R-es] Agrupación de valores de variable definida en fila y objeto temporal
Hola Rubén, 2012/5/22 Rubén Gómez Antolí <>> Hola: > > Estoy teniendo problemas con el correo, esto parece que no llegó. > > El 20/05/12 12:28, Rubén Gómez Antolí escribió: > >> Hola: >> >> Gracias Jorge y Carlos por vuestras respuestas. >> >De nada!> >> El 18/05/12 01:53, Jorge I Velez escribió: >> >> Hola Lobo, >>> >>> Lo siguiente podria ayudarte: >>> >>> # datos >>> DB.telefonos <- structure(list(Empresa = structure(c(1L, 1L, 1L, 2L, 2L, >>> 2L), .Label = c("Empr.1", "Empr.2"), class = "factor"), Numero >>> c(666666666, 666666666, >>> >> >> No conocía «structure», gracias por el ejemplo. > >En realidad la funcion es dput() y como resultado entrega la estructura del objeto. Luega esta estructura puede ser interpretada directamente por R despues de pegarla y copiarla en la consola.> >> >> # funcion para convertir la duracion a segundos >>> # asumiendo que x:y:z significa x minutos, y segundos y z ms >>> segundos <- function(x){ >>> x <- as.numeric(x) >>> sum(as.numeric(x)[1:2]*60^c(1, 0)) + x[3]/1000 >>> } >>> >> >> Lo que es mirar las cosas con otra perspectiva. Yo estaba empeñado en >> convertirlo en un objeto temporal, cuando lo más fácil es tratarlo como >> un número que significa segundos, o minutos que me interesa más que >> segundos. >> >>:-) Me ha parecido muy interesante el detalle que tienes elevando la>> multiplicación a 1 y 0. >> >Tiene que ver con el orden de las operaciones: primero calcula 60^c(1, 0) y luego multiplica x[1:2] por el resultado. Es un detalle que funciona muy bien.> >> [...] >>> >>> # total por empresa/mes >>> with(DB.telefonos, tapply(Duracion, list(Empresa, Mes), sum)) >>> with(DB.telefonos, aggregate(Duracion, list(Empresa, Mes), sum)) >>> >>> >> Perfecto, con estos ejemplos y los que comenta Carlos ya puedo terminar >> la tarea. Muchísimas gracias a los dos. >> >> >> Para ayuda con mas calculos mira ?tapply, ?aggregate, ?ave y la libreria >>> plyr. Los graficos podrias obtenerlos con ?barplot, ?plot, ?coplot y >>> las alternativas en lattice o ggplot2. >>> >> >> Estoy intentando encontrar alguna documentación que cubra con amplitud >> estos temas de modificación de datos, hasta el momento no tengo éxito. >> ¿Hay algo por ahí o habrá que ir saltando de detalle en detalle en la >> múltiple y variada documentación existente? >> >Si. Te sugiero ver la documentacion de plyr en http://www.jstatsoft.org/v40/i01 Saludos, Jorge.-> >> Saludos, >>> Jorge.- >>> >> >> Salud y Revolución. >> >> Lobo. >> > > -- > Libertad es poder elegir en cualquier momento. Ahora yo elijo GNU/Linux, > para no atar mis manos con las cadenas del soft propietario. > --------- > Desde El Ejido, en Almería, usuario registrado Linux #294013 > http://www.counter.li.org > > ______________________________**_________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/**listinfo/r-help-es<https://stat.ethz.ch/mailman/listinfo/r-help-es> >[[alternative HTML version deleted]]