2016-05-06 9 views
1

これは恥ずかしいです:ローリング・デート・ルールに基づくID変数の作成方法は?

enter image description here

Arghhhh:私はこれに類似した構造を持っている私のコードのいくつかの部分を認めます!実際のプログラマーは、このようなことを見てくれるのですか?

図は、自己説明する必要があります: 私はWEATHERDATE列に基づいてID「(年-1)_(年)」を返しシーズンという変数を必要とします。

したがって、 '1998-06-15'から '1999-06-14'までの日付を持つ行は、シーズン ID列の下に「1998-1999」を返します。

WEATHERDATE列は、1998-01-01からTODAYまで実行されます。

これには1/2ライナーの解決策があります。私は動物園パッケージを試しましたが、成功しませんでした。

私がここで欠けている明白な解決策を教えてくれるRウィザードですか?

***再現性の例:もちろん

WEATHERDATE <- seq(as.Date("1998-01-01"), len=99999, by=1) 
VARIABLE <- rnorm(n = length(WEATHERDATE)) 
data_mex <- data.frame(WEATHERDATE, VARIABLE) 
## how to create SEASON based on dates?? 
# I would then run the code block from above, something like: 
data_mex <- within(data_mex, Season[DATEWEATHER >= ymd(StartOfSeason)+365*0 & DATEWEATHER < ymd(StartOfSeason)+365*1 ] <- "1998-1999") 

私は戻ってくると、毎年が理想的であるコード:)ここ

答えて

6

あなたは、ベースRの2行でこれを行うためにcut.Dateseq.Dateを使用することができます、私はあなたの季節のための最新の日付として"2280-06-15"を使用していたが、あなたはSys.Date()とそれを交換したい場合があり

seasons <- format(as.Date(cut.Date(as.Date(data_mex$WEATHERDATE), 
       breaks=seq.Date(as.Date("1997-06-15"), 
       as.Date("2280-06-15", "year"))), "%Y") 
data_mex$seasons <- paste0(seasons, "-", as.numeric(seasons) + 1) 

注意またはあなたの仕事に適切なときはいつでも。

これが返されます。

> head(data_mex) 
    WEATHERDATE VARIABLE seasons 
1 1998-01-01 -0.2260734 1997-1998 
2 1998-01-02 0.3222805 1997-1998 
3 1998-01-03 -0.1554167 1997-1998 
4 1998-01-04 -0.5591154 1997-1998 
5 1998-01-05 1.0729737 1997-1998 
6 1998-01-06 1.0030025 1997-1998 

> tail(data_mex) 
     WEATHERDATE VARIABLE seasons 
99994 2271-10-10 0.59986466 2271-2272 
99995 2271-10-11 0.37304603 2271-2272 
99996 2271-10-12 1.30822156 2271-2272 
99997 2271-10-13 0.01204986 2271-2272 
99998 2271-10-14 0.87340544 2271-2272 
99999 2271-10-15 0.44098083 2271-2272 
+0

非常にいいです、@ajrwhite。 tail(data_mex)は、データの最後の1年間に失敗したことを示します。あなたはあなたの答えにそれを修正することができますか? – Dan

+0

私が言及したように、あなたのデータに合うように 'seq.Date'に正しい範囲を指定する必要があります。この場合、 'Sys.Date()'を '' 2280-06-15 ''に変更しました。これはサンプルデータセットを完全にカバーします。 – ajrwhite

+0

もちろん!ありがとう、@ajrwhite – Dan

1

に触れることはありません解決策は一つの解決策であるあなた所望の出力を得るために使用することができます。

data_mex$seasonId <- 
    with(data_mex, 
     ifelse(as.numeric(format(WEATHERDATE, '%m')) >= 6 & 
       as.numeric(format(WEATHERDATE, '%d')) >= 15, 
       paste(format(WEATHERDATE, '%Y'), 
        as.numeric(format(WEATHERDATE, '%Y')) + 1, sep = '-'), 
       paste(as.numeric(format(WEATHERDATE, '%Y')) - 1, 
        format(WEATHERDATE, '%Y'), sep = '-'))) 

出力結果は次のとおりです。

head(data_mex) 
    WEATHERDATE VARIABLE seasonId 
1 1998-01-01 -0.02541724 1997-1998 
2 1998-01-02 -0.48725913 1997-1998 
3 1998-01-03 0.06204881 1997-1998 
4 1998-01-04 -0.15207281 1997-1998 
5 1998-01-05 -0.61809248 1997-1998 
6 1998-01-06 -1.20427734 1997-1998 

tail(data_mex) 
     WEATHERDATE VARIABLE seasonId 
99994 2271-10-10 -0.8976144 2271-2272 
99995 2271-10-11 -0.5684972 2271-2272 
99996 2271-10-12 -0.8847031 2271-2272 
99997 2271-10-13 -0.2659979 2271-2272 
99998 2271-10-14 -0.9108352 2271-2272 
99999 2271-10-15 1.1601581 2271-2272 

毎回年の部分を抽出し、月と日の値に基づいて遅れや先行年を貼り付けます。 formatメソッドでは、日付の特定の部分を抽出することができます。

+0

おかげで、私はそれが短いだと私はあなたのソリューションで15 MONTHとYEAR(6枚でそれを壊すのではなく、StartOfSeason変数を使用してすることができますので、ajrwhiteのソリューションを選択することになりました) – Dan

関連する問題