2016-05-06 16 views
1

Das ist peinlich: Ich gebe mehrere Teile des Codes von mir eine ähnliche Struktur wie dieses:Wie erstelle ich eine ID-Variable basierend auf der Rolling-Date-Regel?

enter image description here

arghhhh! Schaukeln echte Programmierer, wenn sie so etwas sehen?

Die Figur sollte selbsterklärend sein: Ich brauche eine variable Saison genannt, die eine ID „(Jahr-1) _ (Jahr)“ gibt auf der Grundlage der WEATHERDATE Spalte.

So sollte jede Zeile mit Daten von "1998-06-15" bis "1999-06-14" "1998-1999" unter der Saison ID-Spalte zurückgeben.

Die Spalte WEATHERDATE läuft einfach von 1998-01-01 bis HEUTE.

Ich wette, es gibt eine One/Two-Liner-Lösung zu diesem. Ich habe versucht, die Zoo-Paket aber keinen Erfolg.

Irgendein R-Assistent, um mich auf die offensichtliche Lösung zu verweisen, die ich hier vermisse?

*** REPRODUZIERBARE Beispiel:

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

Natürlich ist eine Lösung, wo muss ich den Code zurück und berühren Sie nicht kommen jedes Jahr wäre ideal :)

Antwort

6

können Sie verwenden cut.Date und seq.Date dies in der Basis R in zwei Linien zu tun:

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

Hinweis verwendet habe "2280-06-15" als letztes Datum für die Jahreszeit, aber Sie können das ersetzt werden sollen mit Sys.Date(), oder wann immer es für Ihre Aufgabe geeignet ist.

Das gibt:

> 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

Sehr schön, @ajrwhite. tail (data_mex) zeigt an, dass es für das/die letzte (n) Jahr (e) der Dataseries fehlschlägt. Gibt es eine Chance, dass Sie das auf Ihrer Antwort beheben können? – Dan

+0

Wie bereits erwähnt, müssen Sie den richtigen Bereich in 'seq.Date' angeben, um Ihren Daten zu entsprechen. In diesem Fall habe ich 'Sys.Date()' in '" 2280-06-15 "' geändert, was Ihnen eine vollständige Abdeckung Ihres Beispieldatensatzes bietet. – ajrwhite

+0

Natürlich! Danke, @ajrwhite – Dan

1

Hier ist eine Lösung, die Sie verwenden können, um die gewünschte Ausgabe zu erhalten:

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 = '-'))) 

resultierende Ausgabe ist:

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 

Sie extrahieren den Jahresabschnitt jedes Mal und fügen das verzögerte oder führende Jahr basierend auf dem Monat und dem Tag ein. format Methode ermöglicht Ihnen, bestimmte Teile des Datums zu extrahieren.

+0

Dank, ich landete ajrwhite ‚s Lösung der Wahl, weil es kürzer ist, und ich kann StartOfSeason Variable verwenden, anstatt sie zu brechen in Stücken für Monat und Jahr bis (6 und 15 in Ihrer Lösung) – Dan