Hier sind zwei mögliche Einzeiler. Vielleicht nicht so einfach wie gewünscht, aber sie sind kurz und die zweite verwendet Minus.
1) findInterval Zoo Indizes kann logisch so dass dieser Code mit findInterval
mit logischem Zustand arbeitet, wo z
ist die Eingang POSIXct Zooserie., st
ist POSIXct Vektor beginnt und en
ist ein entsprechendes POSIXct Vektor des Endes. Der unten stehende Code bildet c(st[1], en[1] + .001, st[2], en[2] + .001, ...)
, so dass die geradzahligen Intervalle Bereiche angeben, die beibehalten werden sollen, und ungerade, um ausgeschlossen zu werden. Dies setzt voraus, dass die Intervalle geordnet und nichtüberlappend sind, so dass st[1] < en[1] < st[2] < en[2] < ...
Das scheint in der Frage der Fall zu sein.
z[ findInterval(index(z), c(rbind(st, en + .001))) %% 2 == 0 ]
Beachten Sie, dass, wenn die Länge von st
und en
jeweils 1 sind dann vereinfacht es an:
z[ findInterval(index(z), c(st, en + .001)) != 1 ]
2) Spiel Wenn die st
und en
Werte unter den index(z)
Werte konnten wir abwechselnd Verwenden Sie match
. Dies wäre zum Beispiel bei den in der Frage gezeigten Beginn und Ende der Fall, wenn z
eine stündliche Reihe wäre. Dies nutzt die Tatsache aus, dass z[-(3:4)]
die Elemente 3 und 4 aus der Zoo-Serie z
ausschließt. Der folgende Code wandelt die POSIXct-Werte in Indizes zwischen 1, 2, 3, ..., Länge (z) um und gibt sie mit Minus aus.
z[ - unlist(Map(seq, match(st, index(z)), match(en, index(z)))) ]
Beachten Sie, dass, wenn die Länge von st
und en
jeweils 1 ist dann vereinfacht es nur:
z[ - seq(match(st, index(z)), match(en, index(z)) ]
Beispiel (2)
Zum Beispiel, versuchen Sie es mit diesem Eingänge:
library(zoo)
tt <- seq(as.POSIXct("2011-01-01 00:00:00"), as.POSIXct("2011-01-04 23:00:00"), by="hour")
z <- zoo(seq_along(tt), tt)
st <- as.POSIXct(c("2011-01-02 13:00:00", "2011-01-04 15:00:00"))
en <- as.POSIXct(c("2011-01-02 14:00:00", "2011-01-04 17:00:00"))
Jetzt können wir das ausführen.
z0 <- z[ - unlist(Map(seq, match(st, index(z)), match(en, index(z)))) ]
plot(z0, type = "p", pch = 20)
Beachten Sie die zwei ausgeschlossenen Bereiche in der Grafik unten.
Können Sie ein kleines Beispiel (simulierte Daten) zur Verfügung stellen? –
Siehe [mcve] für ein reproduzierbares Beispiel. In diesem Fall habe ich eine in meiner Antwort angegeben. –
Vielen Dank @ G.Grothiedieck, ich werde einen Blick darauf werfen und den Anweisungen in der Zukunft folgen. –