2011-01-22 12 views
2

に置き換えてください。火曜日はすべて2つの日付の間で検索したいと思います。しかし、火曜日が休日のユーザ定義のリストにある場合、私は水曜日を代わりにしたいと思います。火曜日のベクトルを取得しますが、火曜日が休日の場合は、水曜日にR

このコードは、私のテストで動作しますが、それはかなりjankyであり、私はそれを黙って失敗します怖いです。

low.date <- "1996-01-01" 
high.date <- "1997-01-01" 
holidays = c("01-01", "07-04", "12-25") 
tues <- seq(as.Date(low.date), as.Date(high.date), by = 1) 
tues <- subset(tues, format(tues, "%a") == "Tue") 
tues <- ifelse(format(tues, "%m-%d") %in% holidays, tues + 1, tues) 
tues <- as.Date(tues, origin = "1970-01-01") 

ありがとうございます!回答はtimeDateパッケージを指していますが、私は営業日や休日を見つける方法しか見ません。私が使用しているものよりもクリーナー/安全なロジックはありますか?基本パッケージで

+0

ですが、そのような再使用して変数 'tues'を行いますPOSIXltとは対照的に、1日目であること日曜日日曜日から始まりそれはテストするのが難しいです。 2回目のtuesへの割り当てにエラーがあった場合、それは最後までにもう2回上書きされるので、トレースバックするのは難しいでしょう。 –

+0

@G - よろしくお願いします。ありがとう。時にはRAMを節約していると思うこともありますが、この場合はばかげています。 –

答えて

2

POSIXltは、あなたが日の名前はシステムからシステムに変更するので、少し安全です数、としてwdayにアクセスすることができます。

low.date <- "1996-01-01" 
high.date <- "1997-01-01" 
holidays <- c("01-01", "07-04", "12-25") 

all.days <- seq(as.Date(low.date), as.Date(high.date), by = "day") 

# Tuesday is Day 2 of the week 
all.tues <- all.days[as.POSIXlt(all.days)$wday == 2] 
tues.holidays <- format(all.tues, "%m-%d") %in% holidays 
all.tues[tues.holidays] <- all.tues[tues.holidays] + 1 
+0

これはポスターのソリューションよりも悪いようです。 –

+0

それを少しきれいにしましたが、はるかに明確になるとは思いません。元の質問のコードは、すべての日を順番に並べ替え、毎日再フォーマットして文字列を比較して火曜日かどうかを確認し、毎週再フォーマットして休日かどうかを確認し、毎日ifelseで再割り当てするか、ない。申し訳ありませんが、これは良いです。 –

+0

ポスターソリューションのように '' Date "'クラスを使うことに固執する必要があります。秒に基づく計算の導入は特に望ましくない。 –

4

解決策のロジックを変更することは困難です。しかしここにlubridateパッケージのwday機能を使用して別のフォームです。 lubridateパッケージ日数が若干不便

hol_tue <- wday(tues) == 3L & format(tues, "%m-%d") %in% holidays 
wday(tues)[hol_tue] <- 4 

それが唯一のマイナーなコメント0

+0

なぜ日曜日は始まりませんか?あなたはどこかで週を始める必要があり、日曜日に始まった使用済みタイムシートのために私が働いたほとんどの企業は、標準のstrftime関数も、日曜日を日曜日と見なします。 – Sharpie

+0

@Sharpie、0は1ではありません:)これは私のポイント(更新済み)です。私は日曜日から始まっても構いませんが、0と呼んでいます。POSIXltは、火曜日を2日目と呼びます。私はあなたが火曜日を意味する週の第2曜日を言うとき、それがどのように米国であるのかヨーロッパではわかりません。 – VitoshKa

+0

@VistoshKa - ありがとう!これは私が 'ludridate'について聞いたのは二度目ですので、私はそれを調べなければなりません。 –