Seleccione los valores de vectores usando fecha como el índice
Pregunta
Supongamos que tengo un llamado vector, bar
:
bar=c()
bar["1997-10-14"]=1
bar["2001-10-14"]=2
bar["2007-10-14"]=1
¿Cómo puedo seleccionar bar
todos los valores para los que el índice está dentro de un intervalo de fechas específico? Por lo tanto, si miro para todos los valores entre "1995-01-01"
y "2000-06-01"
, que debería obtener 1
. Y lo mismo para el período comprendido entre "2001-09-01"
y "2007-11-04"
, que debería obtener 2
y 1
.
Solución
Este problema se ha resuelto para el bien de la href="http://cran.r-project.org/packages=xts" rel="nofollow noreferrer"> XTS paquete que se extiende la funcionalidad de la paquete zoológico .
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>
Hay mucho más aquí - pero el punto básico es hacer no operar en las cuerdas se hacen pasar por fechas.
Utilice un tipo de Date
, o preferiblemente incluso un paquete de extensión construido para indexar eficientemente en millones de fechas.
Otros consejos
Se necesita para convertir sus fechas de caracteres en un tipo Date
con as.Date()
(o un tipo POSIX si tiene más información como la hora del día). A continuación, puede hacer comparaciones con estándar operadores relacionales como <= y> =.
Usted debe considerar el uso de un paquete de series temporales como zoo
para esto.
Editar
Sólo para responder a su comentario, he aquí un ejemplo de la utilización de fechas con su vector existente:
> 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
A pesar de que usted realmente debe sólo tiene que utilizar un paquete de series de tiempo. He aquí cómo usted puede hacer esto con zoo
(o xts
, timeSeries
, fts
, etc.):
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"),]
Dado que el índice es ahora un tipo Date
, Usted puede hacer tantas comparaciones que desee. Leer la viñeta zoo
para más información.
El uso hecho de que las fechas están en orden léxico:
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
El resultado se denomina vector (como se bar
original, que no es una lista es llamado vector).
Como Dirk afirma en su respuesta que es mejor uso Date
por razones de eficiencia. Sin paquetes externos que se podía reorganizar los datos y crear dos vectores (o de dos columnas data.frame
) uno para fechas, uno de los valores:
bar_dates <- as.Date(c("1997-10-14", "2001-10-14", "2007-10-14"))
bar_values <- c(1,2,1)
a continuación, utilizar la indexación simple:
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