2016-04-05 5 views
0

Ich arbeite in R. Ich habe eine Datumssequenz und ich möchte zuordnen, ob jedes bestimmte Datum eine Schulzeit oder Schulferien ist. Ich plane, dies zu tun, indem ich eine Datenfeldspalte verwende, in der jede Zeile "Holiday" oder "Term" heißtR Kennzeichnung mehrerer Datumszeiträume in einer POSIXlt-Datumssequenz

Meine Vorgehensweise besteht darin, eine Zeitsequenz zu erstellen und jedes Feiertagsdatum einzeln mithilfe eines Vektors anzugeben; das erste Element ist das Startdatum des Urlaubs und das zweite ist das Ende des Urlaubs.

Ich erstellen dann eine if-or-Anweisung, um zu testen, ob die Zeit innerhalb eines der in den Vektoren angegebenen Urlaubsdaten liegt.

Hier ist mein Code so weit:

start <- as.POSIXlt("2015-10-10 00:00:00") 
end <- as.POSIXlt("2016-03-31 00:00:00") 

DateSeq <- seq(from=start, to=end, by="mins") 

#Holidays defined using a vector with by start and end date 

H1 <- c("2015-10-26", "2015-11-3") #October half term 
H2 <- c("2015-12-16", "2016-01-05") #Christmas holiday 
H3 <- c("2016-02-15", "2016-02-19") #Feb half term 
H4 <- c("2016-03-24", "2016-03-31") #Easter holiday 

date_table <- data.frame(Time = DateSeq) 

if ((round(date_table$Time, units = "days")== H1[1] <> H1[2]) |   (round(date_table$Time, units = "days") == H2[1] <> H2[2])) { 
    date_table$Holiday <- "Holiday" 
} else { 
    date_table$Holiday <- "Term" 
} 

Wie Sie diesen Code und einfach nicht funktioniert sehen können Etiketten alle Zeilen als „Laufzeit“.

Deshalb frage ich mich folgende:

  1. Wie ich den Datumsbereich in dem Urlaub Vektoren angeben kann, so kann es in der if-Anweisung verwendet werden?

  2. Ob dies der beste Ansatz ist? Ich bin ziemlich neu in R und habe über Alternativen nachgedacht, wie zum Beispiel das Erstellen eines Satzes von einzelnen Sequenzen für Semester und Feiertage und dann das Zusammenfügen. Dieser Ansatz scheint jedoch fummelig, würde aber Ihre Gedanken zu schätzen wissen.

Danke für Ihre Hilfe.

Antwort

1

Ähnlich wie Ihr Ansatz vermeiden if-else.

# Or alternatively by="mins" 
DateSeq <- seq(from=start, to=end, by="hours") 
date_table <- data.frame(Time = DateSeq) 

# Put all holidays together 
H<-rbind(H1,H2,H3,H4) 

# Or alternatively set to "Term" 
date_table$Holiday<-0 

# Assign all the holidays 
for (i in 1:nrow(H)){ 
    date_table[date_table$Time > H[i,1] & date_table$Time < H[i,2],"Holiday"]<-1 # or "Holiday" 
} 

# Check they are correctly assign 
plot(date_table) 
+0

Vielen Dank für Ihre Antwort, es funktioniert wirklich gut aber der letzte Tag des Urlaubs bleibt als Term bezeichnet. Ich habe versucht, die alkey

+0

Sie können die 'date_table $ Zeit fishtank

+0

Danke @fishtank – alkey

0

Sie könnten cut() verwenden, um DateSeq in Term und Feiertag zu schneiden.

res <- cut(DateSeq, breaks = as.POSIXlt(c(H1, H2, H3, H4), format = "%Y-%m-%d"), labels = c("October", "term1", "Christmas", "term2", "Feb", "Term3", "Easter")) 
table(res) 
+0

Danke für Ihre Antwort, es scheint, dass diese Lösung die Datumssequenz in jeden Ausdruck aufteilt und dann die Minuten zählt. Wie könnte ich diese Informationen dann in einen Datenrahmen eingeben? – alkey

+0

Die Tabelle soll nur zeigen, dass 'cut' funktioniert hat. Was willst du in einen data.frame eingeben? –

Verwandte Themen