2010-12-03 2 views
10

Ich verwende R ff Paket und ich habe einige ffdf Objekte (Abmessungen ca. 1,5 M x 80), die ich arbeiten muss. Ich habe jedoch einige Schwierigkeiten, meinen Kopf um die effizienten Schneide-/Trennoperationen herum zu bekommen. Subsetting ffdf Objekte in R

Zum Beispiel habe ich zwei Integer-Spalten haben den Namen „YEAR“ und „Alter“, und ich möchte eine Tabelle von AGE machen, wenn das Jahr 2005

Ein Ansatz ist, ist dies:

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

Die Operation table() ist schnell, aber das Erstellen des Bitvektors ist ziemlich langsam. Hat jemand Empfehlungen, um das besser zu machen?

Antwort

0

Nicht vertraut mit ff Objekte zu manipulieren, aber das Problem, das Sie klingt wie eine klassische tapply() Aufgabe beschreiben:

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

ich etwas annehmen würde, so schneller bewegen würde als die Zwei-Schritt-Lösung, die Sie oben geben, aber vielleicht missverstehe ich, wie ff Datenstrukturen arbeiten?

+0

Wenn es nicht 'ff' wäre, könnte ich etwas viel einfacheres machen, wie' mit (Teilmenge (a.fdf, YEAR == 1999), Tabelle (AGE)) '. 'ff' ist der Teil, der es schwieriger macht. –

2

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

0

Mein Ansatz so etwas wie dieses wäre:

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 als deutlich schneller zu sein:

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

YMMV, da diese Faktoren sind nicht Zeichen und meine ffdf ist ~ 4.3M * 42.

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