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.

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top