Ponieważ pytanie, które dotyczy tygodnia od 00-53, przyjmujemy, że liczba tygodni to liczba czwartków w danym roku w danym dniu lub przed tą datą. Tak więc pierwszy czwartek roku rozpoczyna się w pierwszym tygodniu, a tydzień 0 jest przypisany do dowolnych dni wcześniej.
(Pojawiły się uwagi, że jeśli pierwszy dzień roku byłby we wtorek, to byłby tydzień 1, ale gdyby tak było, nigdy nie byłoby tygodnia 0, co wydaje się wymagane w temacie, więc pewne wyjaśnienia dotyczące jaka może być wymagana definicja liczby tygodniowej, tutaj użyjemy definicji z poprzedniego paragrafu, ale nietrudno byłoby ją zmienić, gdybyśmy wiedzieli, jaka jest definicja, na przykład, jeśli zawsze chcieliśmy tego pierwszego tygodnia w roku 1, nawet jeśli był to krótki tydzień, możemy dodać !is.thu(jan1(d))
do wyniku.)
Oba poniższe rozwiązania są na tyle krótkie, że można je wyrazić jednym zdaniem; jednak, dla jasności, umieściliśmy je w kilku krótkich funkcjach. Pierwsza jest szczególnie prosta, ale druga jest automatycznie wektoryzowana bez potrzeby stosowania sapply
i prawdopodobnie byłaby bardziej wydajna.
1. suma czwartki w roku To rozwiązanie zakłada wejście d
jest klasy "Date"
i po prostu sumuje liczbę czwartki w roku przed lub na nim:
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"))))
}
Możemy przetestować go w ten sposób :
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
Na podstawie funkcji nextfri
w zoo quickref vignette widzimy, że liczba dni od Epoki (1970-01-01) następnego czwartku (lub danego dnia, jeśli jest już czwartek) jest taka, jak podana przez nextthu
w pierwszym linia poniżej.Stosując to do pierwszego dnia roku czerpiemy wynik gdzie d
jest jak dawniej:
nextthu <- function(d) 7 * ceiling(as.numeric(d)/7)
week4a <- function(d) (as.numeric(d) - nextthu(jan1(d))) %/% 7 + 1
A oto test
week4a(d) # 1 4 5 6 7 9
Dodano: poprawiony błąd w drugim roztworze.
Dlaczego chcesz to zrobić, jeśli mogę zapytać? – Arun
Więc jeśli rok rozpoczął się we wtorek, tydzień 1 to wt/środa, a tydzień 2 zaczyna się w czwartek ...? – joran
tak. Tydzień powinien być od wt. Do śr. – Eco06