Wählen Sie Werte aus dem Vektor mit Datum als Index
Frage
Angenommen, ich habe einen benannten Vektor, bar
:
bar=c()
bar["1997-10-14"]=1
bar["2001-10-14"]=2
bar["2007-10-14"]=1
Wie kann ich von bar
wählen alle Werte, für die der Index innerhalb eines bestimmten Zeitraums? Also, wenn ich für alle Werte zwischen "1995-01-01"
und "2000-06-01"
aussehen, sollte ich 1
bekommen. Und in ähnlicher Weise für die Zeit zwischen "2001-09-01"
und "2007-11-04"
, ich soll 2
und 1
erhalten.
Lösung
Dieses Problem wurde für gut mit dem xts Paket der Funktionalität reicht von das Zoo Paket.
R> library(xts)
Loading required package: zoo
R> bar <- xts(1:3, order.by=as.Date("2001-01-01")+365*0:2)
R> bar
[,1]
2001-01-01 1
2002-01-01 2
2003-01-01 3
R> bar["2002::"] ## open range with a start year
[,1]
2002-01-01 2
2003-01-01 3
R> bar["::2002"] ## or end year
[,1]
2001-01-01 1
2002-01-01 2
R> bar["2002-01-01"] ## or hits a particular date
[,1]
2002-01-01 2
R>
Es gibt viel mehr hier - aber der springende Punkt ist tun nicht arbeiten auf Strings als Daten getarnt.
Verwenden Sie einen Date
Typ oder vorzugsweise sogar ein Paket Erweiterung effizient Index auf Millionen von Terminen gebaut.
Andere Tipps
Sie benötigen stammt aus Zeichen in einen Date
Typen mit as.Date()
zu konvertieren (oder einem POSIX-Typen, wenn Sie weitere Informationen wie die Tageszeit haben). Dann können Sie Vergleiche mit Standard relationalen Operatoren wie <= und> =.
Sie sollten eine Zeitreihe Paket wie zoo
hierfür in Betracht ziehen.
Bearbeiten :
Just reagiert auf Ihren Kommentar, hier ist ein Beispiel für Termine mit Ihrem bestehenden Vektor mit:
> as.Date(names(bar)) < as.Date("2001-10-14")
[1] TRUE FALSE FALSE
> bar[as.Date(names(bar)) < as.Date("2001-10-14")]
1997-10-14
1
Auch wenn Sie wirklich nur eine Zeitreihe Paket verwenden sollten. Hier ist, wie Sie dies tun könnten mit zoo
(oder xts
, timeSeries
, fts
usw.):
library(zoo)
ts <- zoo(c(1, 2, 1), as.Date(c("1997-10-14", "2001-10-14", "2007-10-14")))
ts[index(ts) < as.Date("2001-10-14"),]
Da der Index nun ein Date
Typ, können Sie so viele Vergleiche machen, wie Sie wollen. Lesen Sie die zoo
Vignette für weitere Informationen.
Mit Tatsache, dass Termine in lexikalischer Reihenfolge sind:
bar[names(bar) > "1995-01-01" & names(bar) < "2000-06-01"]
# 1997-10-14
# 1
bar[names(bar) > "2001-09-01" & names(bar) < "2007-11-04"]
# 2001-10-14 2007-10-14
# 2 1
Das Ergebnis wird Vektor genannt (wie man original bar
, es ist nicht eine Liste, um es Vektor genannt wird).
Wie Dirk heißt es in seiner Antwort, es ist besser zu Einsatz Date
aus Effizienzgründen. Ohne externe Pakete könnten Sie Ihnen Daten neu ordnen und erstellen Sie zwei Vektoren (oder zweispaltigen data.frame
) einen für Daten, einen für Werte:
bar_dates <- as.Date(c("1997-10-14", "2001-10-14", "2007-10-14"))
bar_values <- c(1,2,1)
dann verwenden einfache Indizierung:
bar_values[bar_dates > as.Date("1995-01-01") & bar_dates < as.Date("2000-06-01")]
# [1] 1
bar_values[bar_dates > as.Date("2001-09-01") & bar_dates < as.Date("2007-11-04")]
# [1] 2 1