2010-12-03 6 views
10

J'utilise le paquet ff de R et j'ai quelques objets ffdf avec lesquels je dois travailler. J'ai de la difficulté à me concentrer sur les opérations efficaces de découpage en tranches et en dés.Sous-ensemble des objets ffdf dans R

Par exemple, j'ai deux colonnes entières nommées « AN » et « AGE », et je veux faire une table d'âge où l'année est 2005.

Une approche est la suivante:

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"]) 

L'opération table() est rapide mais la construction du vecteur binaire est assez lente. Quelqu'un at-il des recommandations pour le faire mieux?

Répondre

0

Vous n'êtes pas familier avec la manipulation ff objets, mais le problème que vous décrivez ressemble à une tâche tapply() classique:

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

Je suppose que quelque chose comme ça serait aller plus vite que la solution en deux étapes vous donner ci-dessus, mais peut-être que je ne comprends pas comment ff structures de données fonctionnent?

+0

Si ce ne 'ff', je pouvais faire quelque chose de beaucoup plus simple, comme' avec (sous-ensemble (a.fdf, AN == 1999), table (AGE)) '. 'ff' est la partie qui rend les choses plus difficiles. –

2

Le package ffbase fournit de nombreuses fonctions de base pour les objets ff/ffdf, y compris subset.ff. Avec un peu de test limité, il semble que subset.ff est relativement rapide. Essayez de charger ffbase puis en utilisant le code plus simple que vous avez suggéré à partir d'un commentaire précédent (with(subset(a.fdf, YEAR==1999)).

0

Mon approche serait quelque chose comme ceci:

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

semble être nettement plus rapide que:

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

YMMV, car ceux-ci sont des facteurs, et non pas des personnages, et mon ffdf est ~ 4,3M * 42.

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