Tengo un conjunto de datos con los lugares y las fechas. Quiero calcular semana del año como número (00-53) pero usando el jueves como el primer día de la semana. Los datos se parece a esto:

  location <- c(a,b,a,b,a,b)
  date <- c("04-01-2013","26-01-2013","03-02-2013","09-02-2013","20-02-2013","03-03-2013")
  mydf <- data.frame(location, date)
  mydf

Sé que hay strftime función para el cálculo de semana del año, pero sólo es posible utilizar lunes o el domingo como primer día de la semana.
Cualquier ayuda sería muy apreciada.

¿Por qué quieres hacer eso, si puedo preguntar?
Así que si un año comenzó un martes, 1 de la semana es el Martes/Miércoles y la semana 2 comienza el jueves…?
sí. La semana debe ser de martes hasta incluyendo Mier.
El strftime convención para la semana de la numeración es 0-53. (A diferencia de los otros indexación en R.)
Así que si un año comenzó un martes, la semana 0 mar/Mie y 1 semana comienza el jueves

OriginalEl autor Eco06 | 2013-03-07

2 Comentarios

  1. 22

    Acaba de agregar 4 a la Fecha de los valores con formato:

    > mydf$Dt <- as.Date(mydf$date, format="%d-%m-%Y")
    > weeknum <- as.numeric( format(mydf$Dt+3, "%U"))
    > weeknum
    [1] 1 4 5 6 7 9

    Ello se utiliza un 0 sobre la base de contar convención, ya que es lo que strftime proporciona y estamos empezando a llevar a cuestas de que la base de código, así que el primer viernes en un año en el que comienza el martes como fue el caso en 2013 sería de 1 semana de resultado. Sumar 1 al valor si desea que un 1 basado en la convención. (Fundamentalmente, la Fecha formateado los valores están en un entero secuencia desde el «origen», por lo que no reconocen años o semanas. La adición de 4 sólo se desplaza el marco de referencia del subyacente en la Fecha de entero.)

    Editar la nota. Cambiado a un complemento de la estrategia de tres por Gabor del consejo. …. que todavía no aborda la cuestión de cómo tratar con la última semana del año anterior.

    Hay alguna pregunta de lo que la definición de número de la semana es, pero en ningún caso hay 1, 4, 5, 6, 7, 9 los jueves en el año antes de las 6 fechas de la pregunta, respectivamente, lo cual plantea la pregunta de si el 8 en la respuesta es correcta. También format(as.Date("2013-12-31")+4, "%U") da 00.
    El «add-4» estrategia genera un incremento en jueves, por lo que el recuento de los jueves estaría de acuerdo con un «add-3» de la estrategia.
    Una solución para el final de año problema podría ser restar 7 días si es en diciembre y, a continuación, añadir 1 a la semana count: ifelse(months(d) == "December", as.numeric(format(d-4, "%U"))+1, as.numeric(format(d+3, "%U")))

    OriginalEl autor 42-

  2. 2

    Ya que la pregunta declaró que la semana va de 00-53 asumimos que el número de la semana es el número de los jueves del año en o antes de la fecha en cuestión. Por lo tanto, el primer jueves de cada mes en el año en que comienza la semana 1 y la semana 0 se asigna a los días anteriores a que.

    (Hubo comentarios de que si el primer día del año fueron el martes, a continuación, que sería la semana 1, pero si ese fuera el caso, nunca podía ser una semana 0 como parece ser necesaria en la materia con el fin de aclarar precisamente lo que la definición de número de la semana es posible que sea necesario. Aquí vamos a utilizar la definición en el párrafo anterior, pero no sería difícil cambiarlo si supiéramos lo que la definición era. Por ejemplo, si siempre quisimos la primera semana del año 1, incluso si se tratara de una semana corta, a continuación, podríamos añadir !is.thu(jan1(d)) para el resultado).

    Ambas de las siguientes soluciones son lo suficientemente corto que podría ser expresada en una declaración; sin embargo, se han incluido en varias corto funciones de cada uno para mayor claridad. La primera es particularmente sencilla, pero la segunda es automáticamente vectorizados sin la necesidad de un sapply y es probable que sea más eficiente.

    1. suma jueves en el año Esta solución supone la entrada de d es de clase "Date" y suma el número de los jueves en el año anterior o en el mismo:

    is.thu <- function(x) weekdays(x) == "Thursday"
    jan1 <- function(x) as.Date(cut(x, "year"))
    
    week4 <- function(d) {
      sapply(d, function(d) sum(is.thu(seq(jan1(d), d, by = "day"))))
    }

    Podemos comprobar como esta:

    d <- as.Date(c("2013-01-04", "2013-01-26", "2013-02-03", "2013-02-09", 
        "2013-02-20", "2013-03-03"))
    week4(d) # 1 4 5 6 7 9

    2. nextthu

    Basado en la nextfri función en la el zoológico de quickref viñeta vemos que el número de días transcurridos desde la Época (1970-01-01) del próximo jueves (o el día en cuestión, si ya de por sí un jueves) está dado por nextthu en la primera línea de abajo. Aplicando esto al primer día del año nos derivar el resultado donde d es como antes:

    nextthu <- function(d) 7 * ceiling(as.numeric(d) / 7)
    
    week4a <- function(d) (as.numeric(d) - nextthu(jan1(d))) %/% 7 + 1

    y aquí es una prueba

    week4a(d) # 1 4 5 6 7 9

    AÑADIDO: corregido el error en la segunda solución.

    OriginalEl autor

Dejar respuesta

Please enter your comment!
Please enter your name here