2013-03-07 9 views
14

場所と日付を持つデータセットがあります。私は年の週を数字(00-53)として計算したいが、木曜日を週の最初の日として使用したい。データは次のようになります。年の週番号(0-53)を計算します。

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 

私は年の週を計算するためのstrftime関数があることを知っているが、月曜日または日曜日が週の最初の日として使用することが可能なだけです。 ご協力いただければ幸いです。

+0

私が聞くことができるなら、なぜそれをしたいですか? – Arun

+3

もし1年が火曜日に始まったら、1週目は火/水、2週目は木曜日に始まる...? – joran

+0

はい。週は火曜日から水曜日までです。 – Eco06

答えて

22

ジャスト日付フォーマットの値に4を追加します。

> 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 

それはstrftimeのが提供するものであるので、これは、0ベースのカウント規則を使用して、我々はちょうどそのコードベースをオフに便乗するので、最初の金曜日されています2013年の場合と同様に火曜日から始まる年は1週間の結果となります。 1の規則を使用する場合は、値に1を加えます。 (基本的に、日付形式の値は「原点」からの整数列であり、実際には年数や週数を認識しないため、4を追加するだけで基になるDate-整数の参照フレームがシフトされます)。

メモを編集します。 Gaborのアドバイスごとに3つの戦略を追加しました。 ....これはまだ前年の最後の週に対処する方法の問題に対処していません。

+1

週番号の定義は何ですか?質問の6つの日付の前に、1年、4日、5日、6日、7日、9木があり、答えの8が正しいかどうかという疑問が生じます。また、 'format(as.Date(" 2013-12-31 ")+ 4、"%U ")'は00を返します。 –

+0

"add-4"戦略は木曜日にインクリメントを作成し、木曜日のカウントが一致するようにします「add-3」戦略を採用しています。 –

+0

年末の問題の修正は、12月の場合は7日を減算し、週のカウントに1を加算することです。 'ifelse(months(d)==" December "、 \t as.numeric (d + 3、 "%U")))+ 1、 \t as.numeric –

2

週が00-53になるとの質問があったので、週番号は問題の日付またはその前の年の木曜日の数です。したがって、年の第1木曜日は第1週に始まり、第0週はその前の任意の日に割り当てられます。

(年の最初の日が火曜日だった場合、それは1週目ですが、その場合は件名に必要と思われるように0週になることはありませんので、週番号の定義が必要な場合がありますここでは前項の定義を使用しますが、その定義が分かっていれば変更することは難しくありません。たとえば、最初の週短期間であっても1年になった場合は、!is.thu(jan1(d))を結果に追加することができます)。

以下の両方の解決策は1つのステートメントで表現できるほど短いです。しかし、わかりやすくするために、それぞれをいくつかの短い機能に分けています。最初のものは特に単純ですが、2番目のものはsapplyを必要とせずに自動的にベクトル化され、より効率的です。

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がクラス"Date"であり、直前またはそれに年に木曜日の数を合計すると仮定し年で

1.合計木曜:

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

zoo quickref vignettenextfri関数に基づいて、次の木曜日のEpoch(1970-01-01)以降の日数(またはすでに木曜日の場合は問題の日)は、最初にnextthuで指定された日数下の行。

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 

が追加されます:第二の溶液中に固定されたバグ我々はdが以前のようにある結果を導き出す年の最初の日にこれを適用します。

関連する問題