2010-12-03 17 views
10

Estoy usando el paquete R's ff y tengo algunos objetos ffdf (dimensiones alrededor de 1.5M x 80) con los que necesito trabajar. Sin embargo, estoy teniendo algunos problemas para entender las operaciones de rebanado/corte en cubitos.Subconjunto de objetos ffdf en R

Por ejemplo Tengo dos columnas de números enteros, "Año" y "edad", y quiero hacer una mesa de edad, cuando el año es 2005.

Uno de los enfoques es la siguiente:

ffwhich <- function(x, expr) { 
    b <- bit(nrow(x)) 
    for(i in chunk(x)) b[i] <- eval(substitute(expr), x[i,]) 
    b 
} 
bw <- ffwhich(a.fdf, YEAR==1999) 
answer <- table(a.fdf[bw, "AGE"]) 

La operación table() es rápida, pero construir el vector de bits es bastante lento. ¿Alguien tiene alguna recomendación para hacer esto mejor?

Respuesta

0

no están familiarizados con la manipulación de ff objetos, pero el problema que usted describe suena como un clásico tapply() tarea:

answer <- tapply(a.fdf$YEAR[a.fdf$YEAR == 1995], a.fdf$AGE[a.fdf$YEAR == 1995], length) 

quiero suponer algo así habría moverse más rápido que la solución de dos pasos que das más arriba, pero tal vez estoy malinterpretando cómo funcionan las estructuras de datos ff?

+0

Si fuera 'ff', que podría hacer algo mucho más simple, como' con (subconjunto (a.fdf, AÑO == 1999), tabla (AGE)) '. 'ff' es la parte que lo hace más complicado. –

2

El paquete ffbase proporciona muchas funciones de base para los objetos ff/ffdf, incluido subset.ff. Con un poco de pruebas limitadas, parece que subset.ff es relativamente rápido. Intente cargar ffbase y luego use el código más simple que sugirió de un comentario anterior (with(subset(a.fdf, YEAR==1999)).

0

Mi enfoque sería algo como esto:

system.time({ 
index <- as.ff(which(a.fdf[,'Location'] == 'exonic')); 
table(a.fdf[index,][,'Function']); 
});                        
user system elapsed 
1.128 0.172 1.317 

parece ser significativamente más rápido que:

system.time({ 
bw <- ffwhich(a.fdf, Location=="exonic"); 
table(a.fdf[bw,'Function']); 
}) 
user system elapsed 
24.901 0.208 25.150 

tu caso es distinto, ya que estos son los factores, no personajes, y mi ffdf es ~ 4,3 M * no 42.

identical(table(a.fdf[bw,'Function']), table(a.fdf[index,][,'Function'])); 
[1] TRUE 
Cuestiones relacionadas