10 Stimmen

Unterteilung von ffdf-Objekten in R

Ich verwende R's ff Paket und ich habe einige ffdf Objekte (Abmessungen etwa 1,5 m x 80 m), mit denen ich arbeiten muss. Ich habe einige Schwierigkeiten, meinen Kopf um die effiziente Slicing / Würfeln Operationen aber bekommen.

Ich habe zum Beispiel zwei Integer-Spalten mit den Namen "YEAR" und "AGE", und ich möchte eine Tabelle mit AGE erstellen, wenn das YEAR 2005 ist.

Ein Ansatz ist dieser:

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

Le site table() Operation ist schnell, aber der Aufbau des Bitvektors ist recht langsam. Hat jemand eine Empfehlung, wie man das besser machen kann?

1voto

dnlbrky Punkte 8741

Das Paket ffbase bietet viele Basisfunktionen für ff / ffdf Objekte, einschließlich subset.ff . Nach einigen begrenzten Tests scheint es, dass subset.ff ist relativ schnell. Versuchen Sie zu laden ffbase und dann mit dem einfacheren Code, den Sie in einem früheren Kommentar vorgeschlagen haben ( with(subset(a.fdf, YEAR==1999) ).

0voto

ashaw Punkte 198

Nicht vertraut mit der Manipulation ff Objekte, aber das von Ihnen beschriebene Problem klingt nach einem klassischen tapply() Aufgabe:

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

Ich gehe davon aus, dass so etwas schneller geht als die von Ihnen beschriebene zweistufige Lösung, aber vielleicht verstehe ich das falsch ff Datenstrukturen funktionieren?

0voto

Mein Ansatz wäre in etwa so:

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

Scheint deutlich schneller zu sein als:

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

YMMV, da es sich um Faktoren handelt, nicht um Zeichen, und mein ffdf ist ~4,3M * 42.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X