2011-05-15 13 views
5

como se puede ver en el marco de datos siguiente, RBloomberg devuelve NA para las fechas de fin de semana.Eliminación de datos de fin de semana en un marco de datos R

Quiero eliminar toda la fila si se trata de un fin de semana. ¿Cómo haría esto?

No deseo usar na.omit ya que esto podría eliminar las filas de los días de la semana si/cuando obtengo una NA en los datos por una razón legítima.

ticker  date yld_ytm_mid 
1 R206 2011-05-11  6.946 
2 R206 2011-05-12  6.969 
3 R206 2011-05-13  7.071 
4 R206 2011-05-14   NA 
5 R206 2011-05-15   NA 
6 R201 2011-05-11  7.201 
7 R201 2011-05-12  7.213 
8 R201 2011-05-13  7.323 
9 R201 2011-05-14   NA 
10 R201 2011-05-15   NA 
11 R157 2011-05-11  7.611 
12 R157 2011-05-12  7.622 
13 R157 2011-05-13  7.718 
14 R157 2011-05-14   NA 
15 R157 2011-05-15   NA 
16 R203 2011-05-11  8.165 
17 R203 2011-05-12  8.170 
18 R203 2011-05-13  8.279 
19 R203 2011-05-14   NA 
20 R203 2011-05-15   NA 
21 R204 2011-05-11  8.303 
22 R204 2011-05-12  8.296 
23 R204 2011-05-13  8.386 
24 R204 2011-05-14   NA 
25 R204 2011-05-15   NA 
26 R207 2011-05-11  8.361 
27 R207 2011-05-12  8.371 
28 R207 2011-05-13  8.479 
29 R207 2011-05-14   NA 
30 R207 2011-05-15   NA 
31 R208 2011-05-11  8.392 
32 R208 2011-05-12  8.393 
33 R208 2011-05-13  8.514 
34 R208 2011-05-14   NA 
35 R208 2011-05-15   NA 
36 R186 2011-05-11  8.546 
37 R186 2011-05-12  8.571 
38 R186 2011-05-13  8.664 
39 R186 2011-05-14   NA 
40 R186 2011-05-15   NA 
41 R213 2011-05-11  8.783 
42 R213 2011-05-12  8.802 
43 R213 2011-05-13  8.898 
44 R213 2011-05-14   NA 
45 R213 2011-05-15   NA 
46 R209 2011-05-11  8.785 
47 R209 2011-05-12  8.807 
48 R209 2011-05-13  8.898 
49 R209 2011-05-14   NA 
50 R209 2011-05-15   NA 
51 R214 2011-05-11  8.841 
52 R214 2011-05-12  8.861 
53 R214 2011-05-13  8.958 
54 R214 2011-05-14   NA 
55 R214 2011-05-15   NA 

Respuesta

18

Convertir la columna de la fecha a un POSIXlt, por ejemplo

date <- as.POSIXlt(date,format="%Y-%m-%d") 

Entonces, podrá acceder al día de la semana usando

date$wday 

y subconjuntos de la estructura apropiada

+0

Thanks blindJesse funciona perfectamente. –

4

El La respuesta por blindJesse es correcta y útil, ya que regresa a las funciones de la base R.

Muchos paquetes tienen envolturas auxiliares adicionales. Aquí está uno de timeDate que requiere la conversión a su tipo:

R> isWeekend(as.timeDate(seq(as.Date("2011-01-01"), 
+        to=as.Date("2011-01-07"), by=1))) 
2011-01-01 2011-01-02 2011-01-03 2011-01-04 2011-01-05 2011-01-06 2011-01-07 
     TRUE  TRUE  FALSE  FALSE  FALSE  FALSE  FALSE 
R> 

y aquí es otro enfoque utilizando una función de RcppBDT:

R> sapply(seq(as.Date("2011-01-01"),to=as.Date("2011-01-07"), by=1),getDayOfWeek) 
[1] 6 0 1 2 3 4 5 
R> 
R> sapply(seq(as.Date("2011-01-01"),to=as.Date("2011-01-07"), by=1),getDayOfWeek) 
+   %%6 == 0 
[1] TRUE TRUE FALSE FALSE FALSE FALSE FALSE 
R> 

El paquete lubridate también tiene wday() y hay sin duda, más que; por funciones en otros paquetes.

+0

Gracias Dirk voy a revisar esto para mejorar mi comprensión de R –

12

Para completar, añadiría a la respuesta de blindjesse que mecanografiar? Weekdays revela que R tiene funciones base weekdays(), months() y quarters() que funcionan tanto en posix como en date types, y creo vectorizado, así que esto también funcionaría:

!(weekdays(as.Date(date)) %in% c('Saturday','Sunday')) 
+0

Joran gracias. Sí, puedo ir, esta es una buena alternativa parsimoniosa. ¿Qué significa% en%? ¿Eso es "no estar"? Lo siento soy un chico de Python R es un poco nuevo para mí. –

+0

% en% realmente significa "en", en el sentido de "pertenece a". – lindelof

Cuestiones relacionadas