2011-12-15 5 views
9

Tengo un conjunto de datos, la primera columna de los cuales es la fecha en el formato año-cuartos, como el siguiente¿Cómo puedo leer una serie de fechas de datos trimestrales en R?

1959-I 
1959-II 
1959-III 
1959-IV  
1960-I 
1960-II 
1960-III 
1960-IV 

He importado el conjunto de datos en R, pero no saben cómo convertir este a Date formato utilizando la función as.Date, ya there doesn't appear to be a conversion specification for quarters y acabo de empezar a aprender R.

lo mejor que puedo pensar es algo así como

#extract the year 
> dates <- substring(data$X,1,4) 
> dates[1:8] 
[1] "1959" "1959" "1959" "1959" "1960" "1960" "1960" "1960" 
> dates <- as.numeric(dates) 

#extract the quarter 
> quarters <- substring(data$X,6) 
> quarters[1:10] 
[1] "I " "II " "III " "IV " "I " "II " "III " "IV " 

pero esta no puede ser la mejor manera de hacerlo, y todavía me deja el problema de cómo tratar mi serie quarters. Para empeorar las cosas, hay un personaje en blanco al final de cada personaje que no sé cómo tratar porque hay 3 "longitudes" diferentes para las cadenas de trimestres.

Otra opción, por supuesto, sería para fabricar mi serie propia habitación, con algo como

quarters <- rep(c(1,2,3,4),dates[length(dates)]-dates[1]) 

(estoy bastante orgulloso de mí mismo por haber escrito esta última línea!).

Así que mi pregunta: ¿existe una forma integrada de importar datos trimestrales en el formato que tengo en R, y si no, cualquier otro formato (aún para datos trimestrales)? ¿Alguna sugerencia sobre la mejor manera de proceder?

+0

¿Sería suficiente asignar una fecha al valor de cada trimestre? es decir 'I = 01/01, II = 04/01, III = 07/01, IV = 10/01' o algo similar? – Chase

+0

@Chase, lo que realmente me pregunto es si R reconoce los datos trimestrales, de la misma manera que reconoce los años, meses, etc. De lo contrario, tendré que hacer otra cosa, y su sugerencia es definitivamente una opción (pero seguramente R , un paquete estadístico, tan bien desarrollado, ¿tendría una alternativa incorporada?) – Vivi

+0

Puedo darte una solución ya hecha que vaya por la primera ruta, pero lo más probable es que estés en una alternativa alternativa. Parece que los objetos 'ts' admiten datos trimestrales a través del parámetro' frecuencia = 4'. También puede consultar la [Vista de tareas CRAN para Time Sieres] (http://cran.r-project.org/web/views/TimeSeries.html). Según lo que he visto, los paquetes zoo y xts también son bastante robustos y flexibles, por lo que pueden tener algo enrollado. Apuesto a que alguien vendrá pronto y nos mostrará algo muy elegante. – Chase

Respuesta

15

Supongamos que tenemos datos 1: 8 que corresponden a los 8 trimestres que menciona. Entonces podemos hacer esto:

ts(1:8, start = c(1959, 1), frequency = 4) 
##  Qtr1 Qtr2 Qtr3 Qtr4 
## 1959 1 2 3 4 
## 1960 5 6 7 8 

también el paquete zoológico cuenta la clase "yearqtr":

library(zoo) 

z <- zooreg(1:8, start = as.yearqtr("1959-1"), frequency = 4) 
z 
## 1959 Q1 1959 Q2 1959 Q3 1959 Q4 1960 Q1 1960 Q2 1960 Q3 1960 Q4 
##  1  2  3  4  5  6  7  8 

Si realmente tuvimos un vector de dichos cuartos que no son necesariamente consecutivos:

dt <- c("1959-I", "1959-II", "1959-III", "1959-IV", "1960-I", "1960-II", 
     "1960-III", "1960-IV") 

podríamos convertirlos usando gsubfn:

library(gsubfn) 

g <- gsubfn("I.*", list(`I` = 1, `II` = 2, `III` = 3, `IV` = 4), dt) 
g 
## [1] "1959-1" "1959-2" "1959-3" "1959-4" "1960-1" "1960-2" "1960-3" "1960-4" 

as.yearqtr(g) 
## [1] "1959 Q1" "1959 Q2" "1959 Q3" "1959 Q4" "1960 Q1" "1960 Q2" "1960 Q3" 
## [8] "1960 Q4" 
Cuestiones relacionadas