14

場所と日付を含むデータセットがあります。年の週を数値 (00–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 関数があることは知っていますが、週の最初の日として月曜日または日曜日しか使用できません。どんな助けでも大歓迎です。

4

2 に答える 2

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 を追加すると、基礎となる日付整数の参照フレームがシフトするだけです。)

メモを編集します。ガボールのアドバイスに従って、3 を追加する戦略に変更されました。.... 前年の最後の週をどう処理するかという問題にはまだ対応していません。

于 2013-03-07T17:59:14.833 に答える
2

質問には週が00から53になると記載されているため、週番号は問題の日付以前の年の木曜日の数であると想定します。したがって、その年の最初の木曜日は第1週から始まり、第0週はそれより前の任意の日に割り当てられます。

(年の最初の日が火曜日の場合、それは第1週になるというコメントがありましたが、その場合、主題で必要とされるように第0週はあり得ないので、正確に何の定義が何であるかについてのいくつかの明確化週番号が必要な場合があります。ここでは前の段落の定義を使用しますが、定義が何であるかを知っていれば、変更するのは難しくありません。たとえば、年の最初の週が常に必要な場合は、短い週でも1になる!is.thu(jan1(d))と、結果に追加できます。)

以下の両方のソリューションは、1つのステートメントで表現できるほど十分に短いものです。ただし、わかりやすくするために、それぞれをいくつかの短い関数に分解しました。前者は特に簡単ですが、後者はaを必要とせずに自動的にベクトル化され、sapplyより効率的になる可能性があります。

1.年の木曜日の合計 このソリューションは、入力dがクラスのものである"Date"と想定し、前年またはその年の木曜日の数を合計するだけです。

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 <- 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

動物園のquickrefビネットnextfriの関数に基づいて、次の木曜日(またはすでに木曜日の場合は問題の日)のエポック(1970-01-01)からの日数が最初の行で指定されているとおりであることがわかります。下。これを年の最初の日に適用すると、以前と同じ結果が得られます。nextthud

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

追加:2番目のソリューションのバグを修正しました。

于 2013-03-07T19:33:38.807 に答える