日付のベクトルを入力として取り、日付のベクトルを返す関数を作成しようとしています。出力は、入力日に一致する月の最初の火曜日の日付です。
だから2012-11-19
-->2012-11-06
など。
私は単一の日付である程度の成功を収めましたが、ベクトルの場合に一般化することはできませんでした. 誰か助けてくれませんか?
これは私がこれまでに持っているものです:
firstTuesday <- function(tt){
ct <- as.POSIXct(tt)
lt <- as.POSIXlt(tt)
firstOf <- as.POSIXlt(ct - 60*60*24* (lt$mday - 1))
if (firstOf$wday > 2)
{
adjDays <- (9 - firstOf$wday)
firstTues <- as.POSIXlt(as.POSIXct(firstOf) + 60*60*24*adjDays)
}
else {
adjDays <- (2 - firstOf$wday)
firstTues <- as.POSIXlt(as.POSIXct(firstOf) + 60*60*24*adjDays)
}
return(firstTues)
}
これは単一の日付に対して機能しますfirstTuesday(Sys.Date())
が、日付のベクトルに対してジャンクを生成しました(ベクトル化if
された制御演算子ではないという問題のためだと思います)。
索引付けを使用して、限られた理解を回避しました。次のコードはそのトリックを行うようです。
firstTuesday <- function(tt){
ct <- as.POSIXct(tt)
lt <- as.POSIXlt(tt)
firstOf <- as.POSIXlt(ct - 60*60*24* (lt$mday - 1))
firstTue <- as.POSIXct(firstOf)
idx <- firstOf$wday > 2
firstTue[idx] <- as.POSIXct(firstOf[idx]) + 60*60*24*(9 - firstOf$wday[idx])
firstTue[!idx] <- as.POSIXct(firstOf[!idx]) + 60*60*24*(2 - firstOf$wday[!idx])
return(firstTue)
}