2017-10-04 13 views
1

私は毎日のデータを含むデータテーブルを持っています。このデータテーブルから、毎週水曜日に取得された毎週のデータポイントを抽出したいと考えています。水曜日が休日の場合、つまりデータテーブルでは利用できない場合は、次に利用可能なデータポイントを取得する必要があります。ここで 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 

答えて

1

一つの方法は、(.Iを使用して)位置を見出すdata.tableにジョインを使用している(つまり:(IMOの提案以下)溶液作業

2ではなく、which.min(abs(as.integer(weekday)-3.25))を使用)を使用してください。

df[df[, .I[which.min(abs(as.integer(weekday)-3.25))], by=week(date)]$V1] 
     date weekday 
1: 2012-06-27  3 
2: 2012-07-05  4 
3: 2012-07-11  3 
4: 2012-07-18  3 

実際のデータが年を超えている場合は、by=.(week(date), year(date))を使用する必要があります。直接週の整数の日を返しますdata.table機能wdayがあることが


も注意してください。 strftimeが返す文字の整数値よりも1大きいため、直接使用したい場合は調整が必要です。

単一の変数を使用してdata.tableから、あなたは日付が上記のものと一致することを

df[, weekday := wday(date)] 
df[df[, .I[which.min(abs(weekday-4.25))], by=week(date)]$V1] 
     date weekday 
1: 2012-06-27  4 
2: 2012-07-05  5 
3: 2012-07-11  4 
4: 2012-07-18  4 

注意にしてください。

+0

ありがとう@Imo、これは素晴らしい作品です。残っている不幸な詳細は、年末頃のメソッドの振る舞いです(私のデータは実際に数年にわたり続きます)。 例:2010-12-29は水曜日であり、2011年1月5日は水曜日であり、両方とも休日ではありません。しかし、週と年を並べ替えるので、2010年にはまだ開始週が残っているので、このメソッドは2010-12-31の年の最後の日も返します。 これを防ぐ手段はありますか?いくつかは依然として欲しいかもしれないので、毎年最後の日付をすべて削除するのはかなり危険です。 – Daedalus

+0

このサブセットの後に、日付の違い( 'dat [、dtDiff:= diff(date)]'など)を取る可能性があります。値が5(またはそれ以下)未満の場合、問題があります。そのような行の場合は、水曜日(元の設定では '平日== 3 ')のものを選択してください。 – lmo

関連する問題