私は毎日のデータを含むデータテーブルを持っています。このデータテーブルから、毎週水曜日に取得された毎週のデータポイントを抽出したいと考えています。水曜日が休日の場合、つまりデータテーブルでは利用できない場合は、次に利用可能なデータポイントを取得する必要があります。ここで MWE:出力と毎日のデータに変換し、休日を処理する
library(data.table)
df <- data.table(date=as.Date(c("2012-06-25","2012-06-26","2012-06-27","2012-06-28","2012-06-29","2012-07-02","2012-07-03","2012-07-05","2012-07-06","2012-07-09","2012-07-10","2012-07-11","2012-07-12","2012-07-13","2012-07-16","2012-07-17","2012-07-18","2012-07-19","2012-07-20")))
df[,weekday:=strftime(date,'%u')]
:
date weekday
1: 2012-06-25 1
2: 2012-06-26 2
3: 2012-06-27 3
4: 2012-06-28 4
5: 2012-06-29 5
6: 2012-07-02 1
7: 2012-07-03 2
8: 2012-07-05 4 #here the 4th of July was skipped
9: 2012-07-06 5
10: 2012-07-09 1
11: 2012-07-10 2
12: 2012-07-11 3
13: 2012-07-12 4
14: 2012-07-13 5
15: 2012-07-16 1
16: 2012-07-17 2
17: 2012-07-18 3
18: 2012-07-19 4
19: 2012-07-20 5
私の望ましい結果、この場合には、次のようになります。
date weekday
2012-06-27 3
2012-07-05 4
2012-07-11 3
2012-07-18 3
行くよりも、これを得るためのより効率的な方法はあります週ごとにループを繰り返し、水曜日のデータポイントがデータに含まれているかどうかを確認しますか?私はより良い方法が必要であると感じているので、どんなアドバイスも高く評価されます! 3に最も近い値のここ
df[,weekday:=wday(date)] #faster way to get weekdays, careful: numbers increased by 1 vs strftime
df[,numweek:=floor(as.numeric(date-date[1])/7+1)] #get continuous week numbers extending over end of years
df[df[,.I[which.min(abs(weekday-4.25))],by=.(numweek)]$V1] #gets result
ありがとう@Imo、これは素晴らしい作品です。残っている不幸な詳細は、年末頃のメソッドの振る舞いです(私のデータは実際に数年にわたり続きます)。 例:2010-12-29は水曜日であり、2011年1月5日は水曜日であり、両方とも休日ではありません。しかし、週と年を並べ替えるので、2010年にはまだ開始週が残っているので、このメソッドは2010-12-31の年の最後の日も返します。 これを防ぐ手段はありますか?いくつかは依然として欲しいかもしれないので、毎年最後の日付をすべて削除するのはかなり危険です。 – Daedalus
このサブセットの後に、日付の違い( 'dat [、dtDiff:= diff(date)]'など)を取る可能性があります。値が5(またはそれ以下)未満の場合、問題があります。そのような行の場合は、水曜日(元の設定では '平日== 3 ')のものを選択してください。 – lmo