2016-07-26 6 views
1

私は最近、日付を扱うRで問題に遭遇しました。 2015年の最後の日(2015-12-31)は木曜になり、週の開始日を日曜日と考えると、その週の最後の週には5日しか含まれません。今週金曜日と土曜日の2016-01-01と2016-01-02は53週目に関連し、2016-01-03は1日目に始まります。これは日曜日に始まります。土曜日に日曜日に週の最初の日を開始し、土曜日にその年の最後の日を終了します。

df: 
range  WKN weekday weeknum 
2015-12-26 52 Saturday  7 
2015-12-27 53 Sunday  1 
2015-12-28 53 Monday  2 
2015-12-29 53 Tuesday  3 
2015-12-30 53 Wednesday  4 
2015-12-31 53 Thursday  5 
2016-01-01 1 Friday  6 
2016-01-02 1 Saturday  7 
2016-01-03 2 Sunday  1 
2016-01-04 2 Monday  2 

は今、私は次のように私のデータフレームを持っていると思います:

require(lubridate) 
range <- seq(as.Date('2015-12-26'), by = 1, len = 10) 
df <- data.frame(range) 
df$WKN <- as.numeric(strftime(df$range, format = "%U")) + 1 
df$weekday <- weekdays(df$range) 
df$weeknum <- wday(df$range) 

これは私に次のような結果を与えるだろう

df: 
range  WKN weekday weeknum 
2015-12-26 52 Saturday  7 
2015-12-27 53 Sunday  1 
2015-12-28 53 Monday  2 
2015-12-29 53 Tuesday  3 
2015-12-30 53 Wednesday  4 
2015-12-31 53 Thursday  5 
2016-01-01 53 Friday  6 
2016-01-02 53 Saturday  7 
2016-01-03 1 Sunday  1 
2016-01-04 1 Monday  2 

誰もがすることを自動化する方向に私を指すでした毎年コードを変更する必要はありませんか?あなたが?strptimeをチェックアウトする場合

答えて

1

cumsumを使用することができ、formatで使用可能ないくつかの異なる週番号トークンがあります。ここ%Vほとんどそれは月曜日の週を開始除き、作品なので、調整するために1を追加します。

df$WKN <- as.integer(format(df$range + 1, '%V')) 

df 
##   range WKN weekday weeknum 
## 1 2015-12-26 52 Saturday  7 
## 2 2015-12-27 53 Sunday  1 
## 3 2015-12-28 53 Monday  2 
## 4 2015-12-29 53 Tuesday  3 
## 5 2015-12-30 53 Wednesday  4 
## 6 2015-12-31 53 Thursday  5 
## 7 2016-01-01 53 Friday  6 
## 8 2016-01-02 53 Saturday  7 
## 9 2016-01-03 1 Sunday  1 
## 10 2016-01-04 1 Monday  2 

それとも、タグのようdplyr使用している場合は、

同じものを返し
library(dplyr) 

df %>% mutate(WKN = as.integer(format(range + 1, '%V'))) 

を示唆。あなたもas.integer(format(...))のバージョンと同じ結果を返すどちらも

library(lubridate) 

df$WKN <- isoweek(df$range + 1) 

または

df %>% mutate(WKN = isoweek(range + 1)) 

を行うことができますので、lubridateのisoweek機能は、同等です。

1

我々は論理ベクトル

df$WKN <- unique(df$WKN)[cumsum(df$weeknum==1) +1] 
df$WKN 
#[1] 52 53 53 53 53 53 53 53 1 1 
1

lubridateを使用していることを考慮すると、私はまた、あなたに潤滑液の解決策を提供したいと考えていました。また、他の年と連携する解決策を求めました。ここに行く:

adjust_first_week<- function(year){ 

    first <- floor_date(dmy(paste0("1-1-", year)), "year") 
    two_weeks <- c(first - days(7:1), first + days(0:6)) 

    df <- data.frame(date = two_weeks, 
       day_of_week = weekdays(two_weeks), 
       day_of_year = yday(two_weeks), 
       week_of_year = week(two_weeks)) 

    last_weekend <- which(df$day_of_week == "Sunday")[2] -1 
    df$adjust_week <- df$week_of_year 
    if(last_weekend ==7) return(df) 
    else{ 
     df$adjust_week[8:last_weekend] <- rep(53,length(8:last_weekend)) 
    } 
    return(df) 
    } 
  1. は、数値年取り、その年の最初の日になります。
  2. 1/1/yearの両側に週を追加して2週間の期間を作成します。
  3. あなたの啓発のためにその年の様々な要約統計量を計算します。
  4. 第2日曜日のピックアップ。設計上、1/1/yearは常に8番目のエントリです。
  5. 日曜日がその月の最初の日であれば、何もしません。
  6. それ以外の場合は、年の第1週が第2日曜日に開始されるように、週の上書きを上書きします。ここで

adjust_last_week(2016) 
     date day_of_week day_of_year week_of_year adjust_week 
1 2015-12-25  Friday   359   52   52 
2 2015-12-26 Saturday   360   52   52 
3 2015-12-27  Sunday   361   52   52 
4 2015-12-28  Monday   362   52   52 
5 2015-12-29  Tuesday   363   52   52 
6 2015-12-30 Wednesday   364   52   52 
7 2015-12-31 Thursday   365   53   53 
8 2016-01-01  Friday   1   1   53 
9 2016-01-02 Saturday   2   1   53 
10 2016-01-03  Sunday   3   1   1 
11 2016-01-04  Monday   4   1   1 
12 2016-01-05  Tuesday   5   1   1 
13 2016-01-06 Wednesday   6   1   1 
14 2016-01-07 Thursday   7   1   1 
の結果であります
関連する問題