近接

2017-08-25 16 views
-4

データ:近接

私はtibbleの日付のベクトルを持っています。

# A tibble: 10 x 1 
     Date 
     <dttm> 
1 2017-04-04 
2 2017-04-05 
3 2017-04-07 
4 2017-04-10 
5 2017-04-11 
6 2017-04-12 
7 2017-04-13 
8 2017-04-14 
9 2017-04-17 
10 2017-04-18 

再現使用:

structure(list(Date = structure(c(1491264000, 1491350400, 1491523200, 
1491782400, 1491868800, 1491955200, 1492041600, 1492128000, 1492387200, 
1492473600), class = c("POSIXct", "POSIXt"), tzone = "UTC")), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -10L), .Names = "Date") 

ニード

2つの特徴変数:

  • の過去の休日に近接「

    • '次の休暇に近接'

    私の応答変数がDateが休日または長い週末に近いかどうかに依存するかどうかを判断することです。 4月11日が休日だった場合たとえば、私が望む:休日が異なるため

      Date ProxNxtHol ProxPastHol 
         <dttm> 
    1 2017-04-04 4   32 
    2 2017-04-05 3   33 
    3 2017-04-07 2   34 
    4 2017-04-10 1   35 
    5 2017-04-11 0   36 
    6 2017-04-12 58   1 
    7 2017-04-13 57   2 
    8 2017-04-14 56   3 
    9 2017-04-17 55   4 
    10 2017-04-18 54   5 
    

    私は手動でベクターに自分自身をすべての休日を定義し、2つの日付の差を計算することができますが、これは面倒ですグローバルに(私は場所を示す変数を持っています)

    指定された日付が休日であるかどうかを指定することができる、あらかじめ定義された関数がありますか?

  • +1

    プロキシミティ変数を作成する「日付のベクトル」と休日を作成してください。望ましい出力を提供すればさらに良いでしょう。 – useR

    +0

    @useR Done。質問が更新されました。 – Rahul

    +0

    @ChiPak私は 'lubridate'を調べました。それは私が探している機能を持っているように見えません。 (更新された質問を参照)。 – Rahul

    答えて

    1

    私はこのforループを思いついて、あなたの望む出力に示されている近接度を計算します。以下の手順をご覧ください。

    data frameにあなたの構造を変換し、そのすべての要素米国の休日のdata frameを構築するためにlibrary(timeDate)を使用したクラスDate

    > qdates <- data.frame(qdates) 
    > qdates$Date <- as.Date(qdates$Date) 
    > qdates 
    
         Date 
    1 2017-04-04 
    2 2017-04-05 
    3 2017-04-07 
    4 2017-04-10 
    5 2017-04-11 
    6 2017-04-12 
    7 2017-04-13 
    8 2017-04-14 
    9 2017-04-17 
    10 2017-04-18 
    

    へ。ここで日付を追加/変更したり、連邦休日を含む可能性のある他の組み込み関数を使用することができます。

    > library(timeDate) 
    > hdates <- data.frame(Dates = c(USNewYearsDay(2017), USInaugurationDay(2017), USMLKingsBirthday(2017), 
               USLincolnsBirthday(2017), USWashingtonsBirthday(2017), USCPulaskisBirthday(2017), 
               USGoodFriday(2017), USMemorialDay(2017), USIndependenceDay(2017), USLaborDay(2017), 
               USColumbusDay(2017), USElectionDay(2017), USVeteransDay(2017), USThanksgivingDay(2017), 
               USChristmasDay(2017))) 
    
    > colnames(hdates) <- "HolidayDate" 
    > hdates$HolidayDate <- as.Date(hdates$HolidayDate) 
    > hdates 
    
        HolidayDate 
    1 2017-01-01 
    2 2017-01-20 
    3 2017-01-16 
    4 2017-02-12 
    5 2017-02-22 
    6 2017-03-06 
    7 2017-04-14 
    8 2017-05-29 
    9 2017-07-04 
    10 2017-09-04 
    11 2017-10-09 
    12 2017-11-07 
    13 2017-11-11 
    14 2017-11-23 
    15 2017-12-25 
    

    forループは日付差を計算し、出力に値を設定します。

    for(i in 1:nrow(qdates)) { 
        minDate <- max(hdates[which(hdates$HolidayDate <= qdates$Date[i]),]) 
        maxDate <- min(hdates[which(hdates$HolidayDate >= qdates$Date[i]),]) 
    
        qdates$ProxPastHol[i] <- abs(difftime(minDate, qdates$Date[i], units = "days")) 
        qdates$ProxNxtHol[i] <- abs(difftime(maxDate, qdates$Date[i], units = "days")) 
    } 
    
    > qdates 
    
         Date ProxPastHol ProxNxtHol 
    1 2017-04-04   29   10 
    2 2017-04-05   30   9 
    3 2017-04-07   32   7 
    4 2017-04-10   35   4 
    5 2017-04-11   36   3 
    6 2017-04-12   37   2 
    7 2017-04-13   38   1 
    8 2017-04-14   0   0 
    9 2017-04-17   3   42 
    10 2017-04-18   4   41