Hola, Partiendo de un data frame con 2 variables de fecha (inicio y fin): df <- data.frame(inicio = c(as.Date("2016-01-01"), as.Date("2016-02-14")), fin = c(as.Date("2016-02-01"), as.Date("2016-02-29"))) Necesitaría crear 12 nuevas columnas adicionales, una para cada mes, que compute el número de días del intervalo que caen en cada mes. El resultado deseado sería algo así: inicio fin ene feb mar abr may jun jul ago sep oct nov dic 2016-01-01 2016-02-01 31 1 0 0 0 0 0 0 0 0 0 0 2016-02-14 2016-02-29 0 15 0 0 0 0 0 0 0 0 0 0 Buscando he encontrado una aproximación al problema del reparto, pero no es válida para data frames. La detallo por si sirve de inspiración: table(format(seq(df$inicio, df$fin, by=1), "%m")) Muchas gracias. Rubén [[alternative HTML version deleted]]
Isidro Hidalgo Arellano
2017-Apr-07 11:02 UTC
[R-es] Distribuir intervalo de días entre meses
Podrías probar con algo así: require(lubridate) diasMes = function(limites){ inicio = as.Date(limites[1], format = "%Y-%m-%d") fin = as.Date(limites[2], format = "%Y-%m-%d") secuencia = seq(inicio, fin, "days") meses = month(secuencia) return(table(meses)) } apply(df, 1, diasMes) Un saludo, Isidro Hidalgo Arellano Observatorio del Mercado de Trabajo Consejería de Economía, Empresas y Empleo http://www.castillalamancha.es/ -----Mensaje original----- De: R-help-es [mailto:r-help-es-bounces en r-project.org] En nombre de Rubén Coca Enviado el: viernes, 07 de abril de 2017 12:02 Para: Lista R <r-help-es en r-project.org> Asunto: [R-es] Distribuir intervalo de días entre meses Hola, Partiendo de un data frame con 2 variables de fecha (inicio y fin): df <- data.frame(inicio = c(as.Date("2016-01-01"), as.Date("2016-02-14")), fin = c(as.Date("2016-02-01"), as.Date("2016-02-29"))) Necesitaría crear 12 nuevas columnas adicionales, una para cada mes, que compute el número de días del intervalo que caen en cada mes. El resultado deseado sería algo así: inicio fin ene feb mar abr may jun jul ago sep oct nov dic 2016-01-01 2016-02-01 31 1 0 0 0 0 0 0 0 0 0 0 2016-02-14 2016-02-29 0 15 0 0 0 0 0 0 0 0 0 0 Buscando he encontrado una aproximación al problema del reparto, pero no es válida para data frames. La detallo por si sirve de inspiración: table(format(seq(df$inicio, df$fin, by=1), "%m")) Muchas gracias. Rubén [[alternative HTML version deleted]] _______________________________________________ R-help-es mailing list R-help-es en r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es
Isidro Hidalgo Arellano
2017-Apr-07 11:08 UTC
[R-es] Distribuir intervalo de días entre meses
Acabo de darme cuenta que tenías casi la solución, no lo había leído, disculpa. Lo puedes encapsular así: diasMes2 = function(limites){ inicio = as.Date(limites[1], format = "%Y-%m-%d") fin = as.Date(limites[2], format = "%Y-%m-%d") return(table(format(seq(inicio, fin, by=1), "%m"))) } apply(df, 1, diasMes2) Un saludo, Isidro Hidalgo Arellano Observatorio del Mercado de Trabajo Consejería de Economía, Empresas y Empleo http://www.castillalamancha.es/ -----Mensaje original----- De: Isidro Hidalgo Arellano [mailto:ihidalgo en jccm.es] Enviado el: viernes, 07 de abril de 2017 13:03 Para: 'Rubén Coca' <ruben.coca en gmail.com>; 'Lista R' <r-help-es en r-project.org> Asunto: RE: [R-es] Distribuir intervalo de días entre meses Podrías probar con algo así: require(lubridate) diasMes = function(limites){ inicio = as.Date(limites[1], format = "%Y-%m-%d") fin = as.Date(limites[2], format = "%Y-%m-%d") secuencia = seq(inicio, fin, "days") meses = month(secuencia) return(table(meses)) } apply(df, 1, diasMes) Un saludo, Isidro Hidalgo Arellano Observatorio del Mercado de Trabajo Consejería de Economía, Empresas y Empleo http://www.castillalamancha.es/ -----Mensaje original----- De: R-help-es [mailto:r-help-es-bounces en r-project.org] En nombre de Rubén Coca Enviado el: viernes, 07 de abril de 2017 12:02 Para: Lista R <r-help-es en r-project.org> Asunto: [R-es] Distribuir intervalo de días entre meses Hola, Partiendo de un data frame con 2 variables de fecha (inicio y fin): df <- data.frame(inicio = c(as.Date("2016-01-01"), as.Date("2016-02-14")), fin = c(as.Date("2016-02-01"), as.Date("2016-02-29"))) Necesitaría crear 12 nuevas columnas adicionales, una para cada mes, que compute el número de días del intervalo que caen en cada mes. El resultado deseado sería algo así: inicio fin ene feb mar abr may jun jul ago sep oct nov dic 2016-01-01 2016-02-01 31 1 0 0 0 0 0 0 0 0 0 0 2016-02-14 2016-02-29 0 15 0 0 0 0 0 0 0 0 0 0 Buscando he encontrado una aproximación al problema del reparto, pero no es válida para data frames. La detallo por si sirve de inspiración: table(format(seq(df$inicio, df$fin, by=1), "%m")) Muchas gracias. Rubén [[alternative HTML version deleted]] _______________________________________________ R-help-es mailing list R-help-es en r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es
Isidro Hidalgo Arellano
2017-Apr-10 06:12 UTC
[R-es] Distribuir intervalo de días entre meses
He cambiado las fechas de los intervalos para asegurarme de que funcionaba. Simplemente haciendo que la función te devuelva los 12 meses, "sapply()" te las coloca bien. Luego sólo hay que sumar por filas: df <- data.frame(inicio = c(as.Date("2016-03-01"), as.Date("2016-02-14")), fin = c(as.Date("2016-05-01"), as.Date("2016-02-29"))) diasMes3 = function(posicion){ inicio = as.Date(df[posicion, 1], format = "%Y-%m-%d") fin = as.Date(df[posicion, 2], format = "%Y-%m-%d") extraccion = c(table(format(seq(inicio, fin, by=1), "%m"))) recuento = rep(0, 12) names(recuento) = formatC(1:12, width = 2, format = "d", flag = "0") recuento[names(extraccion)] = extraccion return(recuento) } resultado = sapply(1:nrow(df), diasMes3) rowSums(resultado) Un saludo. Isidro Hidalgo Arellano Observatorio del Mercado de Trabajo Consejería de Economía, Empresas y Empleo http://www.castillalamancha.es/ De: Rubén Coca [mailto:ruben.coca en gmail.com] Enviado el: viernes, 07 de abril de 2017 23:46 Para: Isidro Hidalgo Arellano <ihidalgo en jccm.es> Asunto: Re: [R-es] Distribuir intervalo de días entre meses Gracias por tu respuesta Isidro, me faltaría resolver la creación de columnas en el data frame con el resultado. ¿Alguna idea? Un saludo, Rubén 2017-04-07 13:08 GMT+02:00 Isidro Hidalgo Arellano <ihidalgo en jccm.es <mailto:ihidalgo en jccm.es> >: Acabo de darme cuenta que tenías casi la solución, no lo había leído, disculpa. Lo puedes encapsular así: diasMes2 = function(limites){ inicio = as.Date(limites[1], format = "%Y-%m-%d") fin = as.Date(limites[2], format = "%Y-%m-%d") return(table(format(seq(inicio, fin, by=1), "%m"))) } apply(df, 1, diasMes2) Un saludo, Isidro Hidalgo Arellano Observatorio del Mercado de Trabajo Consejería de Economía, Empresas y Empleo http://www.castillalamancha.es/ -----Mensaje original----- De: Isidro Hidalgo Arellano [mailto:ihidalgo en jccm.es <mailto:ihidalgo en jccm.es> ] Enviado el: viernes, 07 de abril de 2017 13:03 Para: 'Rubén Coca' <ruben.coca en gmail.com <mailto:ruben.coca en gmail.com> >; 'Lista R' <r-help-es en r-project.org <mailto:r-help-es en r-project.org> > Asunto: RE: [R-es] Distribuir intervalo de días entre meses Podrías probar con algo así: require(lubridate) diasMes = function(limites){ inicio = as.Date(limites[1], format = "%Y-%m-%d") fin = as.Date(limites[2], format = "%Y-%m-%d") secuencia = seq(inicio, fin, "days") meses = month(secuencia) return(table(meses)) } apply(df, 1, diasMes) Un saludo, Isidro Hidalgo Arellano Observatorio del Mercado de Trabajo Consejería de Economía, Empresas y Empleo http://www.castillalamancha.es/ -----Mensaje original----- De: R-help-es [mailto:r-help-es-bounces en r-project.org <mailto:r-help-es-bounces en r-project.org> ] En nombre de Rubén Coca Enviado el: viernes, 07 de abril de 2017 12:02 Para: Lista R <r-help-es en r-project.org <mailto:r-help-es en r-project.org> > Asunto: [R-es] Distribuir intervalo de días entre meses Hola, Partiendo de un data frame con 2 variables de fecha (inicio y fin): df <- data.frame(inicio = c(as.Date("2016-01-01"), as.Date("2016-02-14")), fin = c(as.Date("2016-02-01"), as.Date("2016-02-29"))) Necesitaría crear 12 nuevas columnas adicionales, una para cada mes, que compute el número de días del intervalo que caen en cada mes. El resultado deseado sería algo así: inicio fin ene feb mar abr may jun jul ago sep oct nov dic 2016-01-01 2016-02-01 31 1 0 0 0 0 0 0 0 0 0 0 2016-02-14 2016-02-29 0 15 0 0 0 0 0 0 0 0 0 0 Buscando he encontrado una aproximación al problema del reparto, pero no es válida para data frames. La detallo por si sirve de inspiración: table(format(seq(df$inicio, df$fin, by=1), "%m")) Muchas gracias. Rubén [[alternative HTML version deleted]] _______________________________________________ R-help-es mailing list R-help-es en r-project.org <mailto:R-help-es en r-project.org> https://stat.ethz.ch/mailman/listinfo/r-help-es [[alternative HTML version deleted]]