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.

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top