2016-06-21 14 views
0

Ich habe einen großen Datensatz mit ca. 25L Zeilen, wo diese Funktion "status" angewendet wird. Es ist ein Markierungsverfahren. Innerhalb des Fn werden Operationen vektorisiert und Anwendungsfunktionen verwendet. c1-c4 sind die Spalten in meinen Daten. Trotzdem dauert es etwa 5-6 Stunden, um das Fn auszuführen.Wie kann ich einen Datenrahmen teilen und parallel dazu benutzerdefinierte Funktionen ausführen?

status(mydata) 
status <- function (x) { 

x<- subset(x, x$RECORD_TYPE != "INPUT") 
x$c1<- as.character(x$c1) 
x$c2 <- as.factor(x$c2) 
x$c3 <- as.factor(x$c3) 
return (data.frame(cbind( 
     tapply(x$c2, x$c4, 
      function (x) ifelse (!(any(x=="BAD")), "G", sum(x== "BAD"))) , 
     tapply(x$c2D, x$c4, 
      function (x) sum (x== "NEG")) ))) 
       } 

Gibt es eine Möglichkeit, die Fn weiter zu beschleunigen. Ich arbeite in einem Server mit 16 Kernen. Also ich glaube, es kann weiter beschleunigt werden.

+0

Bitte geben Sie ein kleines reproduzierbares Beispiel für andere zu testen – akrun

Antwort

0

Vielleicht ein data.table Ansatz schneller sein würde, als zu versuchen, den Code parallelisieren, aber ich würde eine Probe Ihrer Daten muß sicherstellen, dass diese Antwort richtet ich Ihre Frage:

library(data.table) 

setDT(mydata) 

mydata[ RECORD_TYPE != "INPUT", 
        .(var1 = ifelse (!(any(c2=="BAD")), "G", sum(c2== "BAD")), 
        var2 = sum (c2D== "NEG")), by= c4]