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