2017-09-08 1 views
2

Ich möchte dem Vektor df$lamp_intensity einen Wert zuweisen, der von einem bestimmten Zeitintervall innerhalb von df$date abhängt. Wenn eine bestimmte Beobachtung außerhalb dieses Intervalls liegt, möchte ich einen NA zuweisen. Sobald ich dieses erste Bit Code funktioniert, plane ich verschachteln eine Reihe von ifelse() Anweisungen, um mehrere Zeitintervalle zu behandeln. Ich denke, ich bin ziemlich nah dran, aber ich könnte definitiv eine Hand benutzen.Verwenden einer ifelse() -Anweisung für Datetime-Beobachtungen innerhalb eines bestimmten Intervalls

Vielen Dank!

Hier ist meine Daten:

df <- structure(list(date = structure(c(1504787028, 1504787030, 1504787031, 1504787032, 1504787033, 1504787034, 1504787035, 1504787036, 1504787037, 1504787038), class = c("POSIXct", "POSIXt"), tzone = "UTC"), ppm = c(0.0009765625, 0.0009765625, 0.0009765625, 0.0009765625, 0.0009765625, 0.0009765625, 0.0009765625, 0.0009765625, 0.0009765625, 0.00146484375)), .Names = c("date", "ppm"), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame")) 

df$lamp_intensity <- ifelse(df$date >= as.POSIXct("2017-09-07 12:23:51", 
    format = "%Y-%m-%d %H:%M:%S", tz = "UTC") && ## using '&' generates an error message 
    date <= as.POSIXct("2017-09-07 12:23:55", 
    format = "%Y-%m-%d %H:%M:%S", tz = "UTC"), 0, NA) 

head(df, 10) 

Die Lösung 0 für df$lamp_intensity Reihen zuordnen würde zwischen 2017-09-07 12:23:51 und 2017-09-07 12:23:55

+0

'date <= as.POSIXct ("2017.09.07 12.23.55"' 'sollte df $ date sein <= as.POSIXct (" 2017.09.07 00.23.55 "'. Deshalb erhalten Sie den Fehler mit '&'. – eipi10

Antwort

1

Sie die cut Funktion stattdessen verwenden könnte. Zum Beispiel:

df$lamp_intensity = cut(df$date, 
         breaks=as.POSIXct(c("2017-09-07 12:23:42","2017-09-07 12:23:55", 
              "2017-09-07 12:24:02", "2017-09-07 12:24:31"), tz="UTC"), 
         labels=c(0,1,2)) 

        date   ppm lamp_intensity 
1 2017-09-07 12:23:48 0.0009765625    0 
2 2017-09-07 12:23:50 0.0009765625    0 
3 2017-09-07 12:23:51 0.0009765625    0 
4 2017-09-07 12:23:52 0.0009765625    0 
5 2017-09-07 12:23:53 0.0009765625    0 
6 2017-09-07 12:23:54 0.0009765625    0 
7 2017-09-07 12:23:55 0.0009765625    1 
8 2017-09-07 12:23:56 0.0009765625    1 
9 2017-09-07 12:23:57 0.0009765625    1 
10 2017-09-07 12:23:58 0.0014648438    1 
+0

Ihr Beispiel funktionierte, aber als ich versuchte, es um ~ 10 verschiedene Zeitintervalle zu erweitern, bekam ich immer eine "Länge von Pausen" und "Etiketten" Unterschiedlicher Fehler. Ich bemerkte, dass Sie drei Labels, aber nur zwei Breaks eingeschlossen haben. Ich habe dies auf 10 Breaks und 11 Labels skaliert, bekam aber immer noch diesen Fehler. Setzt 'cut()' voraus, dass wir Breaks für jede Beobachtung definieren "df"? Wenn ja, dann ist die verschachtelte "ifelse()" Anweisung nützlicher für mich. – spacedSparking

+1

Ja, Sie müssen einen weiteren Unterbrechungswert als die Anzahl der Intervalle angeben, die Sie möchten. Zum Beispiel, wenn Sie zwei Intervalle möchten, Sie müssen die Endpunkte plus ein angeben e Punkt in der Mitte, für insgesamt drei Punkte. (Beachten Sie, dass ich meine Antwort so aktualisiert habe, dass sie drei Labels enthält, also vier Breakpoints.) – eipi10

1

Scheint einfach.

start <- as.POSIXct("2017-09-07 12:23:51", format = "%Y-%m-%d %H:%M:%S", tz = "UTC") 
end <- as.POSIXct("2017-09-07 12:23:55", format = "%Y-%m-%d %H:%M:%S", tz = "UTC") 
df$lamp_intensity <- ifelse(start <= df$date & df$date <= end, 0, NA) 
Verwandte Themen