2016-05-06 31 views
1

這是尷尬的:我承認幾件的礦井具有相似的結構驗證碼:如何根據滾動日期規則創建ID變量?

enter image description here

Arghhhh!真正的程序員在看到這樣的事情時會畏縮嗎?

的數字應該是不言自明: 我需要一個叫做返回一個ID「(與去年1)_(年)」變量基礎上,WEATHERDATE列。

因此,日期從'1998-06-15'到'1999-06-14'的任何行都應在季節 ID列下返回「1998-1999」。

WEATHERDATE列簡單地從1998-01-01運行到今天。

我敢打賭,這裏有一個/兩個班輪的解決方案。我試過動物園包但沒有成功。

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

您可以使用cut.Dateseq.Date在基礎R爲此在兩行:

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) 

注意我用"2280-06-15"爲您的賽季的最後日期,但你可能需要更換與Sys.Date(),或者什麼時候適合您的任務。

這將返回:

> 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)顯示它在數據庫的最後一年中失敗。你有什麼機會可以解決你的答案? – 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

謝謝,我最終選擇的ajrwhite解決方案,因爲它是短,我可以在你的解決方案中使用StartOfSeason變量而不是破壞它在片月份和年份(6和15 ) – Dan