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
_______________________________________________
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
[R-es] Distribuir intervalo de días entre meses
1 message · Isidro Hidalgo