質問には週が00から53になると記載されているため、週番号は問題の日付以前の年の木曜日の数であると想定します。したがって、その年の最初の木曜日は第1週から始まり、第0週はそれより前の任意の日に割り当てられます。
(年の最初の日が火曜日の場合、それは第1週になるというコメントがありましたが、その場合、主題で必要とされるように第0週はあり得ないので、正確に何の定義が何であるかについてのいくつかの明確化週番号が必要な場合があります。ここでは前の段落の定義を使用しますが、定義が何であるかを知っていれば、変更するのは難しくありません。たとえば、年の最初の週が常に必要な場合は、短い週でも1になる!is.thu(jan1(d))
と、結果に追加できます。)
以下の両方のソリューションは、1つのステートメントで表現できるほど十分に短いものです。ただし、わかりやすくするために、それぞれをいくつかの短い関数に分解しました。前者は特に簡単ですが、後者はaを必要とせずに自動的にベクトル化され、sapply
より効率的になる可能性があります。
1.年の木曜日の合計 このソリューションは、入力d
がクラスのものである"Date"
と想定し、前年またはその年の木曜日の数を合計するだけです。
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"))))
}
次のようにテストできます。
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
動物園のquickrefビネットnextfri
の関数に基づいて、次の木曜日(またはすでに木曜日の場合は問題の日)のエポック(1970-01-01)からの日数が最初の行で指定されているとおりであることがわかります。下。これを年の最初の日に適用すると、以前と同じ結果が得られます。nextthu
d
nextthu <- function(d) 7 * ceiling(as.numeric(d) / 7)
week4a <- function(d) (as.numeric(d) - nextthu(jan1(d))) %/% 7 + 1
そしてここにテストがあります
week4a(d) # 1 4 5 6 7 9
追加:2番目のソリューションのバグを修正しました。